我有一个RSA密钥(对)表示为大整数模和指数,并需要加密/解密与这些。
我想出了如何在iOS中使用swift来处理所需的密钥。
对于我的问题:有没有办法将模数/指数表示转换成标准的SecKeyRef?
两者都被格式化为大int (来自android),例如,模数如下所示:
23986589886077318012326064844037831693417390067186403792990846282531380456965701688980194375481519508455379138899060072530724598302129656976140458275478340281694599774176865257462922861492999970413042311221914141827738166785420817621605554859384423695247859963064446809695729281306530681131568503935369097838468173777374667631401317163094053418212485192857751897040859007584244053136110895205839896478287122804119514727484734998762296502939823974188856604771622873660784676915716476754048257418841069214486772931445697194023455179601077893872576165858771367831752886749210944303260745331014786145738511592470796648651
发布于 2015-06-23 18:20:14
我有完全相同的任务-给定一个模数和指数,我必须创建一个公钥并使用该密钥加密一条消息。在阅读和尝试各种库上花费了很长时间之后,我能够用OpenSSL完成这一任务。我在下面贴出我的做法。虽然它是用目标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结构,它包含模量和指数,以及enc缓冲区,它将保存原始加密的字节。enc的长度与密钥的大小相同,因为RSA不能对消息进行长时间的密钥加密。
主要工作由RSA_public_encrypt()函数完成。它需要五个参数--要加密的消息的大小、实际的消息字节、存储加密消息的输出缓冲区、RSA密钥和填充方案。这里不使用填充,因为我的消息与键大小完全相同,但是在rsa.h中有一些宏表示最常见的填充方案。
最后,我检查保存加密字节数的status,并在出错时打印错误消息。
我希望这能帮到你和其他人。告诉我你是不是在斯威夫特做的。干杯;-)
将OpenSSL添加到您的iOS项目中很容易使用CocoaPods。只需加上
pod 'OpenSSL-Universal', '1.0.1.k'你的文件。
https://stackoverflow.com/questions/30759803
复制相似问题