当前位置: 首页 > 知识库问答 >
问题:

cipher.unwrap()密钥长度Sun-BouncyCastle兼容性

沈飞翼
2023-03-14
// decode public key
pubk = KeyFactory.getInstance("RSA").generatePublic(
    new X509EncodedKeySpec(X)
);
// decode symmetric key
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.UNWRAP_MODE, pubk);
skey = (SecretKey)cipher.unwrap(key1, "AES", Cipher.SECRET_KEY);

pubk是2048位的RSA键,但有不同的表示形式(Sun或OpenSSL)。
key1是2048位的字节数组。

问题是:我对skey有不同的结果。在Sun JRE上是128位的AES密钥,在Android上是2048位的数组,包含以下字节:
[1,-1,-1....,-1,0,(此处为实际密钥字节)]

原始包装按以下方式进行:

        // generate symmetric key
        kgen = KeyGenerator.getInstance("AES");
        kgen.init(128, SecureRandom.getInstance("SHA1PRNG"));
        skey = kgen.generateKey();

        // create Cipher
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skey);

        // decode private key
        privk = KeyFactory.getInstance("RSA").generatePrivate(
            new PKCS8EncodedKeySpec(X)
        );

        // wrap symmetric key
        cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.WRAP_MODE, privk);
        skey_buffer = cipher.wrap(skey);  

UPD:我没有注意,没有注意到这样一个事实:unwrappedskey不是256位,而是2048位。更新的问题。

共有1个答案

谷梁宜
2023-03-14

二进制数据的大小--AES密钥--是在解密过程中确定的。

加密明文数据的大小由Sun提供程序中的PKCS#1 v1.5解填充机制确定(在解密的第一步,即用私钥进行模幂运算后得到)。换句话说,Sun提供程序默认为“rsa/ecb/pkcs1padding”

然而,在Android提供程序中,并不执行PKCS#1 v1.5的解填充操作,相反,它似乎默认为“rsa/ecb/nopadding”。这就是为什么在结果中看到所有的-1值;这是填充物的一部分。这也意味着使用签名生成的填充机制而不是用于加密的填充机制。这是因为您使用私钥而不是公钥来执行加密。

 类似资料:
  • 我被要求为安全类实现AES算法。在实现过程中,我找不到答案,我如何从用户那里接受像密码这样的任意长度的密钥,并将其转换为128、192或256位密钥。我该怎么办?

  • 我正在学习ssl通信的基础知识,尤其是AES加密。我读了OpenSSL代码,看到了一个名为< code>userkey的指针。 在文件"aes_core. c"中 > 从何而来?它是如何生成的? 我想知道不同版本AES的的实际大小。 256 位版本为 256 / 8 = 32,192 为 24,128 为 16?我有点迷茫。 如果长度是可变的,那么我应该如何为那些符合长度要求的输入创建一个安全的输

  • 考虑以下java代码: 此代码输出“”。所以是64字节,而SHA-256是32字节哈希。 我知道我指定了512位(64字节)作为密钥长度 然而,我希望生成的密钥(PBKDF2)将由SHA-256进行散列,这样无论我使用的密钥大小如何,输出都应始终为32字节。 我错过了什么(或者为什么我的期望是错误的)?

  • 问题内容: 我无法在上创建索引。 MySQL: 问题答案:

  • 问题内容: 我有一个主键为varchar(255)的表。在某些情况下,255个字符不够用。我尝试将字段更改为文本,但是出现以下错误: 我怎样才能解决这个问题? 编辑:我还应该指出,该表具有包含多个列的复合主键。 问题答案: 发生错误是因为MySQL只能索引BLOB或列的前N个字符。所以错误主要发生时,有一个领域/列类型或BLOB或那些属于或类型,如,,,,,和您尝试使一个主键或索引。无论长度是完整

  • 问题内容: 我正在使用3DESC解密数据,但出现以下异常 我的代码: 打印上面使用的所有字节数组 问题答案: DES- EDE密码可与3个不同的子密钥一起使用,因此密钥大小应为24字节(3乘8字节)。如果您只想使用2个键(即在此模式下,第一个键==最后一个键),则只需复制键数组的前8个字节。