在Java和golang中使用AES时获得不同的结果(密码文本)

我正在尝试将用于AES加密的Java代码复制到Golang中。但是,我在golang中没有得到相同的输出


我尝试了以下代码:


Java 代码:


package EncryptionTest;


import java.security.Key;

import java.util.Base64;


import javax.crypto.Cipher;

import javax.crypto.spec.SecretKeySpec;


public class EncryptionDecryptionAES {


    static Cipher cipher;


    public static void main(String[] args) throws Exception {

        Key secretKey;

        secretKey = (Key)new SecretKeySpec("0123456789012345".getBytes(), "AES");

        cipher = Cipher.getInstance("AES");

        String plainText = "AES Symmetric Encryption Decryption";

        System.out.println("Plain Text Before Encryption: " + plainText);

        String encryptedText = encrypt(plainText, secretKey);

        System.out.println("Encrypted Text After Encryption: " + encryptedText);

        String decryptedText = decrypt(encryptedText, secretKey);

        System.out.println("Decrypted Text After Decryption: " + decryptedText);

    }


    public static String encrypt(String plainText, Key secretKey) throws Exception {

        byte[] plainTextByte = plainText.getBytes();

        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        byte[] encryptedByte = cipher.doFinal(plainTextByte);

        Base64.Encoder encoder = Base64.getEncoder();

        String encryptedText = encoder.encodeToString(encryptedByte);

        return encryptedText;

    }


    public static String decrypt(String encryptedText, Key secretKey) throws Exception {

        Base64.Decoder decoder = Base64.getDecoder();

        byte[] encryptedTextByte = decoder.decode(encryptedText);

        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        byte[] decryptedByte = cipher.doFinal(encryptedTextByte);

        String decryptedText = new String(decryptedByte);

        return decryptedText;

    }

}

Java 代码输出:加密前纯文本:AES 对称加密 解密 加密后加密文本:vSmrgH3qU+qEq+3ui0YvwCa6PDBcMyhgOlbh3+zzM+cON6feLk2u1iPW7lITD3vn 解密后的文本:AES 对称加密解密


戈朗代码:


package main


import (

    "crypto/aes"

    "crypto/cipher"

    "encoding/base64"

    "fmt"

)


肥皂起泡泡
浏览 470回答 1
1回答

慕哥9229398

在go代码中,您在GCM模式下使用AES,其中12个字节为零作为IV,但在java代码中,您使用的是AES的默认模式,这在不同的java版本中是不一样的。通过使用GCM模式(在BouncyCastle中提供)并设置相同的IV(12字节零),我得到了相同的输出:package EncryptionTest;import org.bouncycastle.jce.provider.BouncyCastleProvider;import java.security.Key;import java.security.Security;import java.util.Base64;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;public class EncryptionDecryptionAES {    static Cipher cipher;    public static void main(String[] args) throws Exception {        Security.addProvider(new BouncyCastleProvider());        Key secretKey;        secretKey = (Key)new SecretKeySpec("0123456789012345".getBytes(), "AES");        cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");        String plainText = "AES Symmetric Encryption Decryption";        System.out.println("Plain Text Before Encryption: " + plainText);        String encryptedText = encrypt(plainText, secretKey);        System.out.println("Encrypted Text After Encryption: " + encryptedText);        String decryptedText = decrypt(encryptedText, secretKey);        System.out.println("Decrypted Text After Decryption: " + decryptedText);    }    public static String encrypt(String plainText, Key secretKey) throws Exception {        byte[] plainTextByte = plainText.getBytes();        byte[] iv = new byte[12];        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);        byte[] encryptedByte = cipher.doFinal(plainTextByte);        Base64.Encoder encoder = Base64.getEncoder();        String encryptedText = encoder.encodeToString(encryptedByte);        return encryptedText;    }    public static String decrypt(String encryptedText, Key secretKey) throws Exception {        Base64.Decoder decoder = Base64.getDecoder();        byte[] encryptedTextByte = decoder.decode(encryptedText);        byte[] iv = new byte[12];        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);        byte[] decryptedByte = cipher.doFinal(encryptedTextByte);        String decryptedText = new String(decryptedByte);        return decryptedText;    }}输出:Plain Text Before Encryption: AES Symmetric Encryption DecryptionEncrypted Text After Encryption: 7UMh49c5Wqb2BzlttKBEnq5g4fxMK9oJs1EUDIgWzVwlY28k+qd/oFG9SJckBsaX6DHpDecrypted Text After Decryption: AES Symmetric Encryption Decryption
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java