AES密钥

时间:2016-12-10 19:12:02

标签: objective-c encryption cryptography rsa padding

我正在尝试RSA加密32个字符长度的AES密钥。 最后,在预生成的公钥和目标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字节,我该怎么做?

1 个答案:

答案 0 :(得分:1)

您需要使用2048位(即256字节)的RSA密钥加密数据。在这种情况下,模数将是256个字节,并且得到的密文 - 在这种情况下是包装密钥 - 也将具有该大小。

需要做的是将解密的AES密钥作为密文的前缀 - 这是没有意义的。您需要做的是使用接收器的公钥<加密的包裹的 AES密钥添加前缀。

解密后,生成的AES密钥应再次为256位(即32字节)。

对于填充,填充在加密和解密期间应始终相同。目前只有OAEP填充被认为是安全的。如果你使用PKCS#1填充,你必须确保你不会受到填充oracle攻击的攻击。<​​/ p>

出于同样的原因,建议使用AES-GCM而不是CBC,CBC 易受填充oracle攻击。

1024位RSA通常不再被认为是安全的。至少使用2048的密钥。