【发布时间】:2017-04-26 01:04:40
【问题描述】:
我正在尝试对 32 个字符长度的 AES 密钥进行 RSA 加密。 最终在预先生成的公钥和objective-C的这个RSA实现的帮助下成功地做到了这一点: https://github.com/ideawu/Objective-C-RSA/blob/master/RSA.m
NSData *enc = [RSA encryptData:data publicKey:pubkey];
然后调用库的方法。基本上,它的作用如下:它从公钥创建一个 SecKeyRef,然后计算 block_size、data_size 等。最后它调用
SecKeyEncrypt(keyRef, kSecPaddingPKCS1, srcbuf + idx, data_len, outbuf, &outlen);
我不太了解加密方法内部发生了什么,但结果是正确创建的加密密钥。
然后我可以在
的帮助下用公钥解密它SecKeyDecrypt(keyRef, kSecPaddingNone, srcbuf + idx, data_len, outbuf, &outlen);
结果绝对正确。
但是编码的密钥是 144 字节长。这不是我需要的。出于某种原因,我需要密钥正好是 256 字节。
我的第一个想法是用一些常量变量(例如 0)填充其余字节,但我认为这不是应该的。
下一个想法是使用不同的填充。 kSecPaddingPKCS1SHA256 这个名字听起来像是正确的填充,但是用它而不是 kSecPaddingPKCS1 对密钥进行编码会导致应用程序失败并出现错误:
SecKeyEncrypt fail. Error Code: -50
我想它与block_size有关,但我对加密的内部了解甚少。
我需要编码的密钥正好是 256 字节长,我该怎么做?
【问题讨论】:
-
当您声明:“但编码的密钥长度为 144 字节。这不是我需要的。出于某种原因,我需要密钥正好是 256 字节。”,需要 256 字节?
-
RSA 加密密钥(加密前 32 个字符)应附加到消息开头的前 256 个字节。当我对其进行编码时,我只得到144。不知道如何填充其余部分。以为填充是为了它,但未能实现它。
-
你的意思是用
kSecPaddingPKCS1加密,用kSecPaddingNone解密,好像不对。 -
其实,上面链接的实现就是这样。我想知道为什么它也有效。尝试将两者都更改为kSecPaddingPKCS1SHA256,仍然是错误。
-
@zaph 我尝试了两者都是 kSecPaddingPKCS1 - 它的工作原理相同 - 144 字节。
标签: objective-c encryption cryptography rsa padding