- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 RSA key (对)表示为大整数模数和指数,需要用它们进行加密/解密。
我想出了如何使用 swift 在 iOS 中根据需要处理按键。
我的问题:有什么方法可以将模数/指数表示转换为标准的 SecKeyRef?
两者都被格式化为 big int(来自 android),例如,模数如下所示:
23986589886077318012326064844037831693417390067186403792990846282531380456965701688980194375481519508455379138899060072530724598302129656976140458275478340281694599774176865257462922861492999970413042311221914141827738166785420817621605554859384423695247859963064446809695729281306530681131568503935369097838468173777374667631401317163094053418212485192857751897040859007584244053136110895205839896478287122804119514727484734998762296502939823974188856604771622873660784676915716476754048257418841069214486772931445697194023455179601077893872576165858771367831752886749210944303260745331014786145738511592470796648651
最佳答案
我有完全相同的任务 - 给定一个模数和一个指数,我必须创建一个公钥并使用该 key 加密消息。在花了很长时间阅读和尝试各种库之后,我能够使用 OpenSSL 完成此操作。我在下面发布了我的做法。尽管它是用 Objective-C 编写的,但它可能会有所帮助。
NSData* message, modulus, exponent;
BIGNUM* mod = BN_bin2bn((unsigned char *)[modulus bytes], (int)modulus.length, NULL);
if (mod == NULL) {
NSLog(@"Error creating modulus BIGNUM");
}
BIGNUM* exp = BN_bin2bn((unsigned char *)[exponent bytes], (int)exponent.length, NULL);
if (exp == NULL) {
NSLog(@"Error creating exponent BIGNUM");
}
RSA* rsa = RSA_new();
rsa->pad = 0;
rsa->e = exp;
rsa->n = mod;
int keylen = RSA_size(rsa);
unsigned char* enc = malloc(keylen);
char* err = malloc(130);
int status = RSA_public_encrypt((int)message.length, (const unsigned char*)[message bytes], enc, rsa, RSA_NO_PADDING);
if (status != -1) {
NSData* encryptedMessage = [NSData dataWithBytes:enc length:keylen];
NSLog(@"Encryption SUCCESSFUL: %@", encryptedMessage);
}
else {
ERR_load_crypto_strings();
ERR_error_string(ERR_get_error(), err);
NSLog(@"Encryption failed with error: %s", err);
}
free(enc);
free(err);
所以首先我要从我的 NSData
模数和指数中创建大整数。您已经将它们作为大整数,但如果它们未表示为 OpenSSL 的 BIGNUM
类型,则必须转换它们。 BIGNUM
还有其他用于创建大整数的有用函数,例如 BN_hex2bn
和 BN_dec2bn
- 这些函数从包含十六进制或十进制数字的 C 字符串中创建大整数。在我的例子中,模数和指数作为字节数组存储在 NSData
中,BN_bin2bn
直接从中创建一个 BIGNUM
。
继续,我创建了一个 RSA
结构,它代表一个 key 并保存模数和指数,以及 enc
缓冲区,它将保存原始加密字节。 enc
的长度与 key 的长度相同,因为 RSA 不能加密比 key 更长的消息。
主要工作由RSA_public_encrypt()
函数完成。它有五个参数 - 您要加密的消息的大小、实际消息字节、用于存储加密消息的输出缓冲区、RSA key 和填充方案。我在这里没有使用填充,因为我的消息与 key 的大小完全相同,但在 rsa.h
中有代表最常见填充方案的宏。
最后,我检查保存加密字节数的status
,如果出现问题则打印一条错误消息。
希望这对您和其他人有所帮助。告诉我你是否设法用 Swift 做到了。干杯;-)
附言使用 CocoaPods 可以轻松地将 OpenSSL 添加到您的 iOS 项目。只需添加
pod 'OpenSSL-Universal', '1.0.1.k'
到你的播客文件。
关于ios - 从模数/指数中获取 SecKeyRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759803/
我生成一个 RSA 公钥/私钥对,如下所示: CFDataRef privateTag; CFDataRef publicTag; SecKeyRef publicKey; SecKeyRef pri
我正在使用此代码:https://stackoverflow.com/a/19221754/849616 ,但对我来说并非一切都清楚。 我想使用公钥 NSString *pubKey = "1111"
我有一个 RSA key (对)表示为大整数模数和指数,需要用它们进行加密/解密。 我想出了如何使用 swift 在 iOS 中根据需要处理按键。 我的问题:有什么方法可以将模数/指数表示转换为标准的
这个问题在这里已经有了答案: Extracting a public key from key pair in key chain (2 个答案) 关闭 9 年前。 现在我的公钥有问题,我使用 Se
我有两个 key ,公钥和私钥,都存储在 SecKeyRef 变量中。为了简单起见,让我们从公共(public)的开始。我想做的是将它导出到一个 NSData 对象。为此,Apple 提供了一个几乎著
为了从 iPhone 发送和接收加密消息,我需要读取公钥(服务器的公钥)PEM 文件并创建一个 SecKeyRef(后来我什至可以将其存储在钥匙串(keychain)上,以免创建它)再次)。 这是我当
我用 SecKeyGeneratePair 生成了私钥和公钥我已经将 SecKeyRef 转换为 NSData size_t keySize = SecKeyGetBlockSize(publicKe
我需要使用公钥将用户密码加密为 base64 字符串。 公钥是一个 NSString。 是这样的: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgWO7p1AvCa
我有一个从远程服务器收集的公钥,我想使用该公钥执行 RSA 加密。但问题是我将公钥数据作为缓冲区中的字节数组获取。我可以将它转换为 NSData 但我不能转换为 SecKeyRef 所以我可以继续加密
给定一个使用 SecItemImport 从 RSA 私钥加载的 SecKeyRef 有没有办法只为公钥获取或创建一个 SecKeyRef组件?在 OpenSSL 中,这可以通过将模数和公共(publ
我想通过将指数和模数作为私钥来解密 iPhone 上的 RSA 编码的 blob。在 Java 中(使用 javax.crypto),这可以通过如下代码轻松实现: // 1) key RSAPubli
我正在开发一个 iOS 应用程序,我得到一个 base64 编码的公钥,例如: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3gn+tJ1+PbP0GHa6hmM35
我在设备上使用 SecKeyGeneratePair() 在设备上生成了一个 RSA 对称 key 对。我有每个键的 SecKeyRef 结构指针。那么,如何将 SecKeyRef 保存到磁盘?甚至传
任何人请帮助从指数和模数创建SecKeyRef作为我的公共(public)指数 = 010001和 公共(public)模数 =008903fb6d15f352ed3b45add3216f632f71
我需要将我的iPhone应用程序与系统集成,他们需要通过给定的公钥加密数据,有3个文件,3种不同的格式.xml .der和.pem,我研究并找到了一些关于从 DER/PEM 获取 SecKeyRef,
我想从从 OpenSSL 创建的 EC_KEY 导出公钥和私钥,并且我们知道 EC_KEY 保存 key 对,但 openssl 不兼容将 key 对存储到安全中飞地。因此,我想从 OpenSSL 创
在 Swift 中,我创建了一个 SecKeyRef通过调用对象 SecTrustCopyPublicKey在一些原始 X509 证书数据上。这就是这个 SecKeyRef 对象的样子。 Option
我需要一种干净的方法来提取我的服务器公钥并将其与本地数据进行比较,以防止将来过期/更新 key ,但我似乎无法获得 256 位 key 或表达它作为比较有用的数据... 这是我目前所拥有的... -(
我有一个 Base64 格式的 RSa publicKey 值,如何在不添加到 Keychain 的情况下转换为 SecKeyRef 对象 我可以将非 X509 格式的 RSA Raw 值添加到 Ke
我正在尝试使用 OSX 中的安全转换创建对称加密 key ,然后将该 key 保存到钥匙串(keychain)中。我能够创建一个工作 key 并将其保存到钥匙串(keychain)中,但是当我调用该
我是一名优秀的程序员,十分优秀!