Ulr*_*rik 2 c linux encryption openssl rsa
在下面的示例中,我们使用an RSA 256-bit private key来加密32字节的消息而不填充,并将结果存储在同一个内存块中.
#include <openssl/ssl.h>
unsigned char err[256],
msg[] = "This is a message of some sort.",
key[] = "-----BEGIN RSA PRIVATE KEY-----\n"\
"MIGrAgEAAiEA6sZFpHqqFkpskc2GNMl6RHdiEuOqlX3LcW1TnYVgQFECAwEAAQIh\n"\
"AKqoe8FHJVJUwTzvMAo5FrU/t6Cc6GwYDELpU3xxs4nBAhEA+TwHM5ArwBgTtB2y\n"\
"AKlEKQIRAPElwlKWyde1KqHRCjOWX+kCEQDqWYZP9rUcp8cHKpDwTDiZAhBPldOd\n"\
"KDCzJRJN10yTm/RJAhANYsX4BteC/W7VRUjV5jSH\n"\
"-----END RSA PRIVATE KEY-----\n";
void main()
{
//msg[0] = 255;
if (RSA_private_encrypt(32, msg, msg,
PEM_read_bio_RSAPrivateKey(BIO_new_mem_buf(key, -1), NULL, NULL, NULL),
RSA_NO_PADDING) != 32)
{
ERR_load_crypto_strings();
ERR_error_string(ERR_get_error(), err);
puts(err);
}
}
Run Code Online (Sandbox Code Playgroud)
当我们通过删除注释来更改第0个消息字符的值时,加密失败并显示以下消息:
rsa routines:RSA_EAY_PRIVATE_ENCRYPT:data too large for modulus
Run Code Online (Sandbox Code Playgroud)
请注意,非常短的RSA密钥和硬编码的消息长度仅用于演示问题.密钥是使用openssl二进制生成的,并且function失败的密钥也不同(对于4096位密钥,the msg[0] = 192导致失败).
似乎函数将消息的开头解释为长度描述符,即使RSA_NO_PADDING明确说明了.这是一个错误吗?
在RSA中,模数组和数据数组被解释为大整数.数据整数必须小于模数整数.否则,无法恢复加密值.
我已经解码了你的私钥.模数的第一个字节是0xEA.这意味着您签名的数据不能以大于0xEA(234)的字节开头.如果您指定msg[0] = 235;它将再次导致错误.
这就是填充物的来源.填充数据的第一个字节通常是0x00(或者甚至是0x0001,具体取决于填充方案),这使得填充数据不可能在数值上大于模数.
所以,不,你没有发现错误.你只是使用加密错误.我建议你使用一些更高级别的API来签名消息.
请注意,填充对RSA至关重要.没有它,有办法恢复明文或伪造签名.请使用OAEP进行加密,使用PSS进行签名.此外,密钥大小很重要.如今,应该使用4096位密钥.256位密钥是玩具尺寸,现在可能被智能手机打破.
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |