Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c AES密钥的256字节长RSA加密_Objective C_Encryption_Cryptography_Rsa_Padding - Fatal编程技术网

Objective c AES密钥的256字节长RSA加密

Objective c AES密钥的256字节长RSA加密,objective-c,encryption,cryptography,rsa,padding,Objective C,Encryption,Cryptography,Rsa,Padding,我正在尝试RSA加密长度为32个字符的AES密钥。 最终,借助预生成的公钥和针对objective-C的RSA实现,我们成功地做到了这一点: 然后调用库的方法。基本上,它是这样做的:它从公钥创建一个SecKeyRef,然后计算块大小、数据大小等,最后调用 SecKeyEncrypt(keyRef, kSecPaddingPKCS1, srcbuf + idx, data_len, outbuf, &outlen); 我真的不明白加密方法中到底发生了什么,但结果是正确创建了加密密钥 然

我正在尝试RSA加密长度为32个字符的AES密钥。 最终,借助预生成的公钥和针对objective-C的RSA实现,我们成功地做到了这一点:

然后调用库的方法。基本上,它是这样做的:它从公钥创建一个SecKeyRef,然后计算块大小、数据大小等,最后调用

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
我想这与块的大小有关,但我对加密的内部结构知之甚少


我需要编码密钥的长度正好为256字节,如何才能做到这一点?

您需要使用2048位(即256字节)的RSA密钥对数据进行加密。在这种情况下,模数将为256字节,产生的密文(在这种情况下为包装密钥)也将具有该大小

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

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


至于填充,在加密和解密期间填充应该始终相同。目前只有填充被认为是安全的。如果使用PKCS#1填充,则必须确保不易受到填充oracle攻击

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


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

当您声明:“但编码密钥的长度为144字节。这不是我需要的。出于某种原因,我需要密钥的长度正好为256字节。”,什么需要256字节?RSA加密密钥(在加密之前为32个字符)应附加到消息开头的前256个字节。当我编码它时,我只得到144。我不知道如何填补剩下的。本以为是填充,但未能实现。您的意思是用
kSecPaddingPKCS1
加密,用
kSecPaddingNone
解密,这似乎不正确。实际上,这是从上面的链接实现的方式。我想知道为什么它也起作用。试图将两者都更改为kSecPaddingPKCS1SHA256,但仍然存在错误。@zaph我尝试将两者都更改为kSecPaddingPKCS1-其工作方式相同-144字节。这很奇怪,因为任务明确告诉我使用RSA 1024。那我就试试2048。我明白了用接收方的公钥加密AES密钥作为消息前缀的意义。事实上,这正是我想要做的(也许我在提问时是错误的)。我用同样的方法尝试了2048键,但失败了。不再加密和解密。找不到需要更改的其他内容。如果32字节的密钥使用RSA 1024公钥加密,那么我只能得到144个字节的输出,如果RSA实现方法中的某些内容失败,则只能得到0个字节的输出。我发现我一直都错了,加密密钥的实际大小是128。这是我决定尺码的错误。仍然不是256虽然…我想可能有一些错误的文件从该链接。加密是在我注释了剥离私钥的那行代码之后才开始工作的——关于神奇的第22字节,我并不特别喜欢你提到的包装类。通常,直接使用库或平台提供的加密API更容易。在这种情况下,它会跳过取消添加,这意味着它是完全不安全的。不要相信随机密码。
SecKeyEncrypt fail. Error Code: -50