首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从模量/指数得到SecKeyRef

从模量/指数得到SecKeyRef
EN

Stack Overflow用户
提问于 2015-06-10 14:47:17
回答 1查看 1.4K关注 0票数 2

我有一个RSA密钥(对)表示为大整数模和指数,并需要加密/解密与这些。

我想出了如何在iOS中使用swift来处理所需的密钥。

对于我的问题:有没有办法将模数/指数表示转换成标准的SecKeyRef?

两者都被格式化为大int (来自android),例如,模数如下所示:

23986589886077318012326064844037831693417390067186403792990846282531380456965701688980194375481519508455379138899060072530724598302129656976140458275478340281694599774176865257462922861492999970413042311221914141827738166785420817621605554859384423695247859963064446809695729281306530681131568503935369097838468173777374667631401317163094053418212485192857751897040859007584244053136110895205839896478287122804119514727484734998762296502939823974188856604771622873660784676915716476754048257418841069214486772931445697194023455179601077893872576165858771367831752886749210944303260745331014786145738511592470796648651

EN

回答 1

Stack Overflow用户

发布于 2015-06-23 18:20:14

我有完全相同的任务-给定一个模数和指数,我必须创建一个公钥并使用该密钥加密一条消息。在阅读和尝试各种库上花费了很长时间之后,我能够用OpenSSL完成这一任务。我在下面贴出我的做法。虽然它是用目标C写的,但可能会有帮助。

代码语言:javascript
复制
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_hex2bnBN_dec2bn )的其他有用函数--这些函数从包含十六进制或十进制数字的C字符串中创建大整数。在我的例子中,模数和指数作为字节数组存储在一个NSData中,而BN_bin2bn则直接由此创建一个BIGNUM

接下来,我创建了一个表示密钥的RSA结构,它包含模量和指数,以及enc缓冲区,它将保存原始加密的字节。enc的长度与密钥的大小相同,因为RSA不能对消息进行长时间的密钥加密。

主要工作由RSA_public_encrypt()函数完成。它需要五个参数--要加密的消息的大小、实际的消息字节、存储加密消息的输出缓冲区、RSA密钥和填充方案。这里不使用填充,因为我的消息与键大小完全相同,但是在rsa.h中有一些宏表示最常见的填充方案。

最后,我检查保存加密字节数的status,并在出错时打印错误消息。

我希望这能帮到你和其他人。告诉我你是不是在斯威夫特做的。干杯;-)

将OpenSSL添加到您的iOS项目中很容易使用CocoaPods。只需加上

代码语言:javascript
复制
pod 'OpenSSL-Universal', '1.0.1.k'

你的文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30759803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档