java - 使用java进行AES解密

标签 java encryption base64 aes

我已经研究这个问题有一段时间了,但似乎无法发现问题。我已经包含了有问题的方法和给定的输出。不存在错误,只是加密/编码数据解密返回的结果不准确。

有人能发现错误编码吗?

方法

public static void register(){

    try{
        // CREATE KEY AND CIPHER
        byte[] key = username.getBytes();
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        SecretKeySpec secretKey = new SecretKeySpec(key, "AES");

        // ENCRYPT DATA
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] cipherText = cipher.doFinal(password.getBytes("UTF8"));

        // ENCODE DATA
        String encodedString = new String(Base64.encodeBase64(cipherText), "UTF-8");

        // SAVE VARIABLE
        p = new String(encodedString);

        // PRINT DATA
        System.out.println("PLAINTEXT KEY:      " + username);
        System.out.println("MODIFIED PASSWORD:  " + password);
        System.out.println("ENCRYPTED PASSWORD: " + new String(cipherText));
        System.out.println("ENCODED PASSWORD:   " + encodedString);
        System.out.println("P (ENCODED):        " + p);
        System.out.println("");

        // SAVE TO DISK
        try {
            File file = new File("C://Welcome/License.txt");
            file.getParentFile().mkdirs();
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);

            bw.write(new String(p));
            bw.close();
        }
        catch(FileNotFoundException ex){
            ex.printStackTrace();
        }
        catch(IOException ex){
            ex.printStackTrace();
        }
        p = "";

        // CREATE A FOLDER FOR FILES
        try {
            File dir = new File("C://IronFortress/Files");
            dir.mkdir();
        }
        catch(Exception e){
            e.printStackTrace();
        }


        // READ DATA FROM DISK
        String fileName = "C:/Welcome/License.txt";
        String line0 = null;

        try {
            FileReader fr = new FileReader(fileName);
            BufferedReader br = new BufferedReader(fr);

            if((line0 = br.readLine()) != null){
                p = (line0);
            }

            br.close();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        // DECODE PASSWORD
        String decodedString = new String(Base64.decodeBase64(p));

        // CREATE KEY AND CIPHER
        key = username.getBytes();
        Cipher cipher2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
        SecretKeySpec secretKey2 = new SecretKeySpec(key, "AES");

        // DECRYPT PASSWORD
        cipher2.init(Cipher.DECRYPT_MODE, secretKey2);
        byte[] cipherText2 = cipher.doFinal(decodedString.getBytes("UTF8"));

        // PRINT DATA
        System.out.println("P (DECODED):        " + p);
        System.out.println("ENCODED PASSWORD:   " + decodedString);
        System.out.println("DECRYPTED PASSWORD: " + new String(cipherText2));
    }
    catch (Exception e){
        e.printStackTrace();
    }
}

输出

KEY:                mmmmmmmmmmmmmmmm
PASSWORD:           mxxxxxxxxxxxxxxx
ENCRYPTED PASSWORD: CvsoR—:bÜjçÆä†wÖ×_uK)¼i">ŠÏMrE
ENCODED PASSWORD:   Q3Zzb1KXOmLc58bkhnfW1191SwQpvGkiPhmKz01yRQc=
P (ENCODED):        Q3Zzb1KXOmLc58bkhnfW1191SwQpvGkiPhmKz01yRQc=

P (DECODED):        Q3Zzb1KXOmLc58bkhnfW1191SwQpvGkiPhmKz01yRQc=
ENCODED PASSWORD:   CvsoR—:bÜçÆä†wÖ×_uK)¼i">ŠÏMrE
DECRYPTED PASSWORD: ƒÑjQ:y¯€n»×l¬JÍœ£,cá±ß…c}˜àzð`{úÀØ…¢1vŸlЩÚ

最佳答案

问题与上一个问题相同:

String decodedString = new String(Base64.decodeBase64(p));

p 是 Base64 编码的密文。如果对其进行解码,您将得到具有任意字节的密文。当您用字节创建字符串时,您会默默地丢弃一些字节,这使得明文无法恢复。

尝试:

byte[] decoded = Base64.decodeBase64(p);
byte[] cipherText2 = cipher.doFinal(decoded); // this isn't ciphertext, but plaintext

关于java - 使用java进行AES解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32166377/

相关文章:

encryption - 如何将 .net core RSA pem 转换为 xml?

java - 在 Java 中使用哪个哈希值来保证文件的唯一性

java - JSP JDBC SERVLET 显示 classnotfound 异常....一切都正确

c# - 在 WPF 应用程序中加密凭据

java - 将Base64编码的图像字符串加载到JLabel中

c# - Base64编码的字符串可以以3个等号结尾吗?

PHP base64编码一个pdf文件

java - 改造-IllegalArgumentException : unexpected url

java - 重复的毫秒时间戳问题

python - 填充不正确。 AES Python 加密