【问题标题】:Is RSA_NO_PAD algorithm different in C(openssl) and JavacardRSA_NO_PAD 算法在 C(openssl) 和 Javacard 中是否不同
【发布时间】:2017-04-12 07:58:31
【问题描述】:

我有一个 128 字节的 RSA 密钥。我在 javacard 小程序中使用公钥加密了长度为 128 字节的数据,并在 C 应用程序中使用相同密钥对的私钥对其进行了解密。结果数据与原始数据不同。原因是什么?

Javacard 代码

asymCipher = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false);
asymCipher.init(PkTCA, Cipher.MODE_ENCRYPT);
asymCipher.doFinal(data, (short)0, (short)data.length, encrypted, (short)0);

C 代码

int padding = RSA_NO_PADDING;

int private_decrypt(unsigned char * enc_data,int data_len,unsigned char * key, unsigned char *decrypted)
{
    RSA * rsa = createRSA(key,0);
    int  result = RSA_private_decrypt(data_len,enc_data,decrypted,rsa,padding);
    return result;
}

encrypted_length = private_decrypt(PkAIKR,strlen(PkAIKR),privateKeyTCA,PkAIKR_dec);

【问题讨论】:

  • 给我们您的 RSA 密钥和所有数据。

标签: c encryption openssl javacard


【解决方案1】:

解释为无符号大端整数值时,您的数据可能大于模数。 RSA 最终适用于数字,而不是字节。如果该值较大,则该值将首先转换为值 Y = X % N 其中 X 是原始值,N 是模数(而 % 是模数或余数运算)。

所以你只能加密代表 0 到 N 之间数字的数据,否则你的结果是不明确的(它可以是 Y 或 Y + N)。一个有用的技巧是确保您的输入数据长度至少比模数长度小一位(尽管通常完整的最高有效/最左边字节设置为0001)。


请注意 - 除了 RSA-KEM 之外 - 使用没有 PKCS#1 v1.5 填充或 OAEP 填充的 RSA 是不安全的

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多