0

私はここに簡単なコードを持っています.コードはsun.misc.BASE64Encoderとsun.misc.BASE64Decoderを使用しています.Eclipse Java 7.0では利用できません.まったく同じこと、

変数

private static final String ALGORITHM = "AES";
private static final byte[] keyValue = "2H5a1r5i6s3h8C1h".getBytes();

オリジナルコード

public static String AESencrypt(String valueToEnc) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    String encryptedValue = new BASE64Encoder().encode(encValue);
    return encryptedValue;
}

public static String AESdecrypt(String encryptedValue) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}

Apache Commons コードに変更しようとしています

public static String AESencrypt(String valueToEnc) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    String encryptedValue = new Base64().encodeBase64(encValue).toString();
    return encryptedValue;
}

public static String AESdecrypt(String encryptedValue) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = new Base64().decodeBase64(encryptedValue);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}

元のコードは問題なく動作しますが、新しいコードは次の例外をスローします。

スレッド「メイン」での例外 javax.crypto.IllegalBlockSizeException: com.sun.crypto. provider.CipherCore.doFinal(CipherCore.java:676) at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) javax.crypto.Cipher.doFinal(Cipher.java:2087) at trial2.encrypt .AESdecrypt(encrypt.java:28) で trial2.encrypt.main(encrypt.java:37) Java 結果: 1

初期コードをあまり変更せずにこの問題を解決するにはどうすればよいですか。数行のあちこちで OK です。Base64encoding ステップを完全に排除し、次のような暗号のみで動作させることは可能ですか?

public static String AESencrypt(String valueToEnc) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    return encValue.toString();
}

public static String AESdecrypt(String encryptedValue) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decValue = c.doFinal(encryptedValue.getBytes());
    String decryptedValue = new String(decValue);
    return decryptedValue;
}

上記のコードには、2 番目のコードと同様の例外があります。

スレッド「メイン」での例外 javax.crypto.IllegalBlockSizeException: com.sun.crypto. provider.CipherCore.doFinal(CipherCore.java:676) at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) javax.crypto.Cipher.doFinal(Cipher.java:2087) at trial2.encrypt .AESdecrypt(encrypt.java:26) で trial2.encrypt.main(encrypt.java:35) Java 結果: 1

助けてください、TYVM

4

1 に答える 1

2

エラーは暗号化方法にあります。次のコードは間違っています。

byte[] encValue = c.doFinal(valueToEnc.getBytes());
String encryptedValue = new Base64().encodeBase64(encValue).toString();

あなたはバイト配列を呼び出しtoString()ていますが、それはあなたが望むことをしません! 代わりに、次を試してください。

byte[] encValue = c.doFinal(valueToEnc.getBytes());
String encryptedValue = Base64.encodeBase64String(encValue);

これで正しく動作するはずです。

于 2013-03-05T12:38:10.863 に答える