我使用三重DES加密数据。它工作正常,但我有一个问题。
我在哪里可以看到初始化向量(IV)?
使用BASE64Decoder进行3des加密。
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Crypter {
Cipher ecipher;
Cipher dcipher;
Crypter(String as_Phrase)
throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException {
this.ecipher = Cipher.getInstance("DESede");
this.dcipher = Cipher.getInstance("DESede");
this.ecipher.init(1, getSecretKey(as_Phrase));
this.dcipher.init(2, getSecretKey(as_Phrase));
}
public String encrypt(String as_valueToEncrypt)
throws BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException, IOException {
byte[] lbarr_utf8 = as_valueToEncrypt.getBytes("UTF8");
byte[] lbarr_enc = this.ecipher.doFinal(lbarr_utf8);
return new BASE64Encoder().encode(lbarr_enc);
}
public String decrypt(String as_valueToDecrypt)
throws BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException, IOException {
byte[] lbarr_enc = new BASE64Decoder().decodeBuffer(as_valueToDecrypt);
byte[] lbarr_utf8 = this.dcipher.doFinal(lbarr_enc);
return new String(lbarr_utf8, "UTF8");
}
private SecretKey getSecretKey(String as_Phrase)
throws UnsupportedEncodingException {
return new SecretKeySpec(as_Phrase.getBytes("UTF8"), "DESede");
}
}
答案 0 :(得分:6)
您可以从密码中获取IV:
ecipher.getIV();
问题是IV是在init
期间生成的。由于您在构造函数中init
,因此遇到的问题是对不同密文的每次加密使用相同的IV。最好生成一个新的Cipher
并分别为每个加密和解密操作启动它。
您使用实际为DESede
的{{1}}密码。请注意,该模式是ECB,它不使用IV。所以上面的调用返回DESede/ECB/PKCS5Padding
。虽然这是默认模式,但不建议这样做。使用实际使用IV的null
更安全。
因此,当您在CBC模式下解密时,您需要传递该IV:
DESede/CBC/PKCS5Padding
为了减少传递IV的负担,你可以在编码之前将IV附加到密文的前面,然后在解密密文之前将其切掉。 DES是一个64位密码,因此你的IV长度为8个字节。
答案 1 :(得分:1)
Cipher
有getIV()
方法,它返回初始化向量。