Получение другого результата (зашифрованного текста) при использовании AES в Java и golang - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь скопировать код Java для шифрования AES в 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"
)

const NONCESIZE = 12

func main() {
    key := []byte("0123456789012345")
    plaintext := []byte("AES Symmetric Encryption Decryption")
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err.Error())
    }
    nonce := make([]byte, NONCESIZE)
    aesgcm, err := cipher.NewGCM(block)
    if err != nil {
        panic(err.Error())
    }
    ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)
    fmt.Println("Encrypted Text is : ", base64.StdEncoding.EncodeToString(ciphertext))

}

Вывод кода Голанга: Зашифрованный текст: 7UMh49c5Wqb2BzlttKBEnq5g4fxMK9oJs1EUDIgWzVwlY28k + qd / oFG9SJckBsaX6DHp

1 Ответ

2 голосов
/ 27 марта 2019

В коде go вы используете AES в режиме GCM с 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 Decryption
Encrypted Text After Encryption: 7UMh49c5Wqb2BzlttKBEnq5g4fxMK9oJs1EUDIgWzVwlY28k+qd/oFG9SJckBsaX6DHp
Decrypted Text After Decryption: AES Symmetric Encryption Decryption
...