1
public static byte[] decryptByte(byte[] blahh, byte[] keyExample) throws Exception
{
Cipher cipher = null;

try
{
    cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
    SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);

    return cipher.doFinal(Base64.decodeBase64(blah));
}
catch(Exception e)
{
    e.printStackTrace();
}
return null;
}

String keyExample = "99112277445566778899AABBCCDDEEFF0123456789ABCDEF0123456789ABCDEF";
byte[] key = keyExample.getBytes();    
byte[] barrayMessage = {123,45,55,23,64,21,65};    
byte[] result = decryptByte(barrayMessage, key);

スローされた例外:java.security.InvalidKeyException: Invalid AES key length: 64 bytes

4

2 に答える 2

3

String.getBytes()( JDK ドキュメント)を呼び出すと、指定された文字列の文字が、プラットフォームのデフォルトの文字セットを使用して一連のバイトにエンコードされます。

実際に行う必要があるのは、各 16 進数 (基数 16) の数値 ( 0to9Atoの 2 文字で表される、Fたとえばなど) を対応する数値 ( ) 値 (たとえば->バイト) に変換することです。1A99byte"FF"-1

サンプルコードは次のとおりです。

import static java.lang.Character.digit;
...

private static byte[] stringToBytes(String input) {
    int length = input.length();
    byte[] output = new byte[length / 2];

    for (int i = 0; i < length; i += 2) {
        output[i / 2] = (byte) ((digit(input.charAt(i), 16) << 4) | digit(input.charAt(i+1), 16));
    }
    return output;
}

...

String keyExample = "99112277445566778899AABBCCDDEEFF0123456789ABCDEF0123456789ABCDEF";
byte[] key = stringToBytes(keyExample);    
byte[] barrayMessage = {123,45,55,23,64,21,65};    
byte[] result = decryptByte(barrayMessage, key);

各 2 文字を 1 バイトに変換するため、提案された方法では、入力の文字数が偶数であると想定していることに注意してください (また、入力はnull空ではありません)。

そのメソッドが内部で使用される場合、その形式は受け入れられますが、ライブラリの一部として他のユーザーに表示されるようにする場合は、いくつかのチェックを行い、無効な入力に対して例外をスローすることをお勧めします。

于 2013-01-17T12:35:40.753 に答える
3

を呼び出す代わりに、16 進数のデコーダーを使用してキーをデコードしてみてくださいgetBytes()

于 2013-01-16T21:54:15.880 に答える