开发者

AES decryption error in java

I am working on AES algorithm and I get this Exception:

javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at org.enterprisepower.io.MyEncryptTools.decrypt(MyEncryptTools.java:41)
at org.enterprisepower.io.IOUtils.copyStream(IOUtils.java:132)
at org.enterprisepower.net.portforward.Processor$Copier.run(Processor.java:99)
at java.lang.Thread.run(Unknown Source)

the exception happen in the decryption part.I encrypt a message in myClient program and send cipherMessage to myServer program.After server recieve the cipherMessage it throws the above exception, but in client I can decrypt the exact same cipherMessage.(I check this with printing the bytes in both side...)

These are my codes:

//It's decrypt method for both client and server
public  byte[] decrypt(byte[] encryptedData, int length) throws Exception {
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGO);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] enc = new byte[length];
    for (int i = 0; i < length; i++) {
        enc[i] = encryptedData[i];
    }
    byte[] decordedValue= Base64.decodeBase64(enc);//org.apache.commons.codec.binary.*;
    byte[] decValue = c.doFinal(decordedValue);
    return decValue;
}


//Client side
public static void copyStream(InputStream in, OutputStream out,
        boolean closeOnFinish, boolean encrypt, String password) throws Exception {
    MyEncryptTools mit;
    try {
        mit = new MyEncryptTools(password);
        byte[] buf = new byte[BUF_SIZE];
        byte[] enbuf ;
        int count;
        try {
            if (encrypt) {
                while (((count = in.read(buf)) != -1) && alive) {
                    enbuf = mit.encrypt(buf,count);
                    out.write(enbuf, 0, enbuf开发者_StackOverflow.length);
                }
            } else {
                buf = new byte[172];
                while (((count = in.read(buf)) != -1) && alive) {
                    enbuf = mit.decrypt(buf, count);
                    out.write(enbuf, 0, enbuf.length);
                }
            }
        } finally {
            if (closeOnFinish)
                close(in);
            if (closeOnFinish)
                close(out);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } 
}



//Server side
public static void copyStream(InputStream in, OutputStream out,
        boolean closeOnFinish, boolean encrypt, String user, String password) throws Exception {
    MyEncryptTools mit;
    try {
        mit = new MyEncryptTools(password);

        byte[] buf = new byte[BUF_SIZE];
        byte[] enbuf ;
        int count;
        try {
            if (encrypt) {
                System.out.println("Encrypt;");
                while (((count = in.read(buf)) != -1)) {
                    enbuf = mit.encrypt(buf,count);
                    out.write(enbuf, 0, enbuf.length);
                }
            } else {
                buf = new byte[172];
                while (((count = in.read(buf)) != -1)) {
                    enbuf = mit.decrypt(buf, count);
                    out.write(enbuf, 0, enbuf.length);
                }
            }
        } finally {
            if (closeOnFinish)
                close(in);
            if (closeOnFinish)
                close(out);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } 
}

I should mention that I use an array of 117 byte for encrypting and an array of 172 for decrypting.


Use the wonderful CipherInputStream and forget about buffers length.


Your error message says: "Given final block not properly padded". To fix the error specify PKCS7 padding for both encryption or decryption. Alternatively switch to CTR mode, which does not require padding.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜