我需要使用双重长度3DES键来加密随机8字节,然后使用加密值来派生新的3DES键。
当我尝试使用EncryptedRandomValue实例化Desedekeyspec时,我会收到一个错误消息"错误的键大小"。您能告诉我如何解决这个问题吗?
desedekeyspec mykeyspec = new desedekeyspec(EncryptedRandOmvalue);
,如果我所有的秘密行动都是单个des键,我可以避免遇到此错误。但是我需要使用双重长度3DES键和ECB模式。
这是我的代码;
// Generate double length 3DES Master Key
KeyGenerator masterEncKeyGenerator = KeyGenerator.getInstance("DESede");
masterEncKeyGenerator.init(112);
SecretKey masterKey = masterEncKeyGenerator.generateKey();
//Prepare random bytes
byte[] randomKeyValue = "rn4yrbdy".getBytes();
// Encrypt random bytes with the 3DES Master key
final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, masterKey);
byte[] encryptedRandomValue = cipher.doFinal(randomKeyValue);
// Derive new key 3DES Key
SecretKeyFactory mySecretKeyFactory = SecretKeyFactory.getInstance("DESede");
DESedeKeySpec myKeySpec = new DESedeKeySpec(encryptedRandomValue);
SecretKey derivedKey = mySecretKeyFactory.generateSecret(myKeySpec);
我意识到为什么我会遇到这个错误。这是因为Desedekeyspec需要将24个字节作为关键材料采用,但我只给出8个字节。但这就是我的要求:用Master 3DES键,随机8个字节数据...从加密中产生一个3DES键...
三重DES仅连续3个使用不同键完成的单个DES操作。具体来说,这是一个DES加密,然后是DES解密,然后是DES加密。
des e ncrypt- d ecrypt- ecrypt- e ncrypt ncrypt是使它赋予它名称 deside
截然不同的双重长度和Tripple长度键是您在三个DES操作中使用的密钥的哪一部分。
双重长度键:k1 || k2
将提供以下DES操作:
Encrypt(k1) - Decrypt(k2) - Encrypt(k1)
tripple长度键:k1 || k2 || k3
将提供以下DES操作:
Encrypt(k1) - Decrypt(k2) - Encrypt(k3)
Java中的标准实现不直接支持双重长度DES键,但是您可以通过重复键的第一部分作为第三部分来获得相同的效果:k1 || k2 || k1
作为好奇心,您可以通过三次重复单个des键,例如: k1 || k1 || k1
。这简化了backword的兼容性硬件实现。