【问题标题】:256 byte long RSA encryption of AES keyAES 密钥的 256 字节长 RSA 加密
【发布时间】: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


【解决方案1】:

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

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

解密后生成的 AES 密钥应该是 256 位(即 32 字节)。


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

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

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

【讨论】:

  • 很奇怪,因为任务明确告诉我使用RSA 1024。那我会尝试2048的。我看到了用接收者的公钥加密的 AES 密钥为消息添加前缀的意义。实际上,这正是我想要做的(也许我在提问时不正确)。
  • 我用同样的方法尝试了2048键,但失败了。不再加密和解密。找不到其他需要更改的地方。我设法获得的唯一输出是 144 字节,如果 32 字节密钥是用 RSA 1024 公钥加密的,或者当 RSA 实现方法中的某些内容失败时为 0 字节。
  • 我发现我一直错 - 加密密钥的实际大小是128。这是我确定大小的错误。虽然仍然不是 256...
  • 我想该链接中的文件可能有问题。加密只是在我评论了剥离私钥的行之后才开始工作 - 神奇的第 22 个字节有一些东西。
  • 我并不特别喜欢您指出的那种包装类。通常,直接使用库或平台提供的加密 API 会更容易。在这种情况下,它会跳过取消填充,这意味着它完全不安全。不要相信随机密码。
猜你喜欢
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
相关资源
最近更新 更多