gpt4 book ai didi

ios - 从模数/指数中获取 SecKeyRef

转载 作者:可可西里 更新时间:2023-11-01 01:40:00 27 4
gpt4 key购买 nike

我有一个 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_hex2bnBN_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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com