ホームページ  >  記事  >  バックエンド開発  >  Golang 暗号化を考慮して、Java と Scala で AES 暗号化テキストを復号する方法は?

Golang 暗号化を考慮して、Java と Scala で AES 暗号化テキストを復号する方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 07:55:30779ブラウズ

How to Decrypt AES-Encrypted Text in Java and Scala, Given Golang Encryption?

Golang での AES 暗号化と Java でのその復号

質問で提供されている AES 用の Golang 暗号化関数は、Advanced Encryption Standard (AES) アルゴリズムを使用して文字列を暗号化します。 Base64 エンコーディングで暗号文を生成します。 Java でこの暗号文を復号するには、適切な復号関数が必要です。

Java 復号関数

<code class="java">import java.util.Base64;
import javax.crypto.*;
import javax.crypto.spec.*;

public class AESDecryption {

    public static String decode(String base64Text, byte[] key)
            throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        byte[] inputArr = Base64.getUrlDecoder().decode(base64Text);
        SecretKeySpec skSpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
        int blockSize = cipher.getBlockSize();
        IvParameterSpec iv = new IvParameterSpec(Arrays.copyOf(inputArr, blockSize));
        byte[] dataToDecrypt = Arrays.copyOfRange(inputArr, blockSize, inputArr.length);
        cipher.init(Cipher.DECRYPT_MODE, skSpec, iv);
        byte[] result = cipher.doFinal(dataToDecrypt);
        return new String(result, StandardCharsets.UTF_8);
    }

    public static void main(String[] args) {
        // Encryption result from the Go function.
        String base64Text = "c1bpFhxn74yzHQs-vgLcW6E5yL8zJfgceEQgYl0=";
        // The encryption key (same as in Go).
        byte[] key = "0123456789abcdef".getBytes();

        try {
            // Decrypt the ciphertext.
            String decrypted = decode(base64Text, key);
            // Print the decrypted text.
            System.out.println(decrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}</code>

Scala 復号関数

<code class="scala">import java.nio.charset.StandardCharsets
import javax.crypto._
import javax.crypto.spec.{IvParameterSpec, SecretKeySpec}
import java.util.Base64

object AESDecryption {

  def decode(input: String, key: String): String = {
    val cipher = Cipher.getInstance("AES/CFB/NoPadding")
    val blockSize = cipher.getBlockSize
    val keyBytes = key.getBytes
    val inputArr = Base64.getUrlDecoder.decode(input)
    val skSpec = new SecretKeySpec(keyBytes, "AES")
    val iv = new IvParameterSpec(inputArr.slice(0, blockSize).toArray)
    val dataToDecrypt = inputArr.slice(blockSize, inputArr.size)
    cipher.init(Cipher.DECRYPT_MODE, skSpec, iv)
    new String(cipher.doFinal(dataToDecrypt.toArray), StandardCharsets.UTF_8)
  }

  def main(args: Array[String]): Unit = {
    // Encryption result from the Go function.
    val base64Text = "c1bpFhxn74yzHQs-vgLcW6E5yL8zJfgceEQgYl0="
    // The encryption key (same as in Go).
    val key = "0123456789abcdef"

    // Decrypt the ciphertext.
    val decrypted = decode(base64Text, key)
    // Print the decrypted text.
    println(decrypted)
  }
}</code>

Java と Scala の両方の復号関数は暗号文とキーを入力として受け取り、AES/CFB/NoPadding アルゴリズムを使用して暗号文を復号化し、復号化された平文を文字列として返します。

以上がGolang 暗号化を考慮して、Java と Scala で AES 暗号化テキストを復号する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。