我正在尝试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字节,我该怎么做?
答案 0 :(得分:1)
您需要使用2048位(即256字节)的RSA密钥加密数据。在这种情况下,模数将是256个字节,并且得到的密文 - 在这种情况下是包装密钥 - 也将具有该大小。
不需要做的是将解密的AES密钥作为密文的前缀 - 这是没有意义的。您需要做的是使用接收器的公钥<为加密的或包裹的 AES密钥添加前缀。
解密后,生成的AES密钥应再次为256位(即32字节)。
对于填充,填充在加密和解密期间应始终相同。目前只有OAEP填充被认为是安全的。如果你使用PKCS#1填充,你必须确保你不会受到填充oracle攻击的攻击。</ p>
出于同样的原因,建议使用AES-GCM而不是CBC,CBC 也易受填充oracle攻击。
1024位RSA通常不再被认为是安全的。至少使用2048的密钥。