【发布时间】:2018-04-17 09:35:33
【问题描述】:
我创建了以下单例类来加密和解密字符串消息。
public class EncryptionHelper {
private Cipher ecipher;
private Cipher dcipher;
private SecretKey key;
private byte iv[] = { 8, 7, 6, 5, 4, 3, 2, 1 };
private static EncryptionHelper instance;
public static EncryptionHelper getInstance( String defKey ) {
synchronized( EncryptionHelper.class ) {
if ( null == instance ) {
try {
instance = new EncryptionHelper( defKey );
} catch( Exception e ) {
}
}
}
return instance;
}
private EncryptionHelper( String defKey )
throws Exception {
DESedeKeySpec keyspec = new DESedeKeySpec( defKey.getBytes() );
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "TripleDES" );
key = keyfactory.generateSecret( keyspec );
ecipher = Cipher.getInstance( "TripleDES/CBC/PKCS5Padding" );
dcipher = Cipher.getInstance( "TripleDES/CBC/PKCS5Padding" );
ecipher.init( Cipher.ENCRYPT_MODE, key, new IvParameterSpec( iv ) );
dcipher.init( Cipher.DECRYPT_MODE, key, new IvParameterSpec( iv ) );
}
public String encrypt( String str ) {
try {
byte[] utf8 = str.getBytes( "UTF-8" );
byte[] enc = ecipher.doFinal( utf8 );
String val = Base64.getEncoder().encodeToString( enc );
return val;
} catch( UnsupportedEncodingException | IllegalBlockSizeException | BadPaddingException e ) {
}
return str;
}
public String decrypt( String str ) {
try {
byte[] dec = Base64.getDecoder().decode( str );
byte[] utf8 = dcipher.doFinal( dec );
return new String( utf8, "UTF8" );
} catch( IllegalBlockSizeException | BadPaddingException | IOException e ) {
}
return str;
}
}
当我尝试使用这个类的加密和解密方法时,使用两个不同的程序使用不同的密钥,如下所示。
public static void main( String[] args ) {
EncryptionHelper encryptionHelper = EncryptionHelper.getInstance( "000000000000ffffffffffff" );
System.out.println( encryptionHelper.encrypt( "ABCDEFGH" ) );
}
输出是 ::: n+0SEJQDXwfvpdMIdetNow==
和
public static void main( String[] args ) {
// Use different key to decrypt
EncryptionHelper encryptionHelper = EncryptionHelper.getInstance( "111111111111ffffffffffff" );
// Use output of previous call as input to decrypt
System.out.println( encryptionHelper.decrypt( "n+0SEJQDXwfvpdMIdetNow==" ) );
}
输出是 ::: ABCDEFGH
如您所见,我在使用加密和解密方法时使用了不同的密钥,但程序仍然能够使用错误的密钥解密确切的值。
你们能帮我知道,为什么会这样,为什么我可以使用错误的密钥解密?
【问题讨论】:
-
请注意 String.getBytes() 不会从十六进制转换...
标签: encryption cryptography java-security tripledes