如何使用AESWRAP模式包装RSA密钥

问题描述 投票:1回答:1

我想用AESWrap模式包装我的RSA私钥(遵循RFC 3394)。但是我得到例外,说“被包装密钥的长度应该是8字节的倍数”。我认为这主要是因为RSA PrivateKey采用DER格式,因此抛出异常。请建议如何解决此问题。


    SecretKey swkKeySpec = new SecretKeySpec(KEK, 0, swkKey.length, "AES");///KEK is a 256 bit AES key used for wrapping.
    cipher = Cipher.getInstance("AESWrap", "SunJCE");
    cipher.init(Cipher.WRAP_MODE, swkKeySpec);

    byte[] key = keyAttributes.getPrivateKey() ///This returns private key in encoded format which is to be wrapped.
    KeyFactory factory = KeyFactory.getInstance("RSA"); // throws NoSuchAlgorithmException
    PrivateKey privateKey  = factory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
    log.debug("key.length: {}", key.length); ///this gives 634.
    wrappedAppKey = cipher.wrap(privateKey); ///exception thrown at this point`
java encryption aes rsa private-key
1个回答
2
投票

RFC-5649(带有填充算法的高级加密标准(AES)密钥包装)已经发布,用于处理密钥材料不是64位倍数的情况。

BouncyCastle是一个实现许多加密算法的免费Java库,它提供了一个支持RFC-5649密钥包装算法的包装引擎。因此,您可以使用此库来避免遇到Java异常。

注意,例如,我们通常称为2048位的RSA密钥不仅仅是由256字节的数组组成。它由两个素数组成,使得它们的产品可以存储在256字节的数组中,它也由比上述产品低的私有指数组成。根据私钥材料存储在文件中的方式,可以将一些其他公共数据封装在文件中,例如公共指数。因此,2048位的RSA密钥的私钥材料可能不会以256字节存储。

© www.soinside.com 2019 - 2024. All rights reserved.