AES暗号化で結果が異なる場合の対処方法

AES暗号化処理において、同一データを暗号化しても出力結果が毎回異なるという問題が発生することがあります。

Python実装例


from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64

def perform_aes_encryption(message, encryption_key):
    # AES ECBモードによる暗号化オブジェクト生成
    crypto_handler = AES.new(encryption_key, AES.MODE_ECB)
    
    # ブロックサイズに合わせたパディング処理
    padded_data = pad(message, AES.block_size)
    encrypted_result = crypto_handler.encrypt(padded_data)
    
    return encrypted_result

# 暗号化対象のデータ
source_text = b'data'

# 16バイト(128ビット)のキー設定
secret_key = b'my_secret'.ljust(16, b'\x00')

# 暗号化実行
result_cipher = perform_aes_encryption(source_text, secret_key)

# Base64形式での表示用変換
encoded_result = base64.b64encode(result_cipher).decode('utf-8')

print(f"暗号化結果: {encoded_result}")

C#実装例


using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class EncryptionExample
{
    static void Main()
    {
        string targetText = "data";
        string secretKey = "my_secret";

        byte[] resultBytes = ExecuteAesEncryption(targetText, secretKey);
        string base64Result = Convert.ToBase64String(resultBytes);

        Console.WriteLine($"暗号化結果: {base64Result}");
    }

    private static byte[] ExecuteAesEncryption(string inputText, string encryptionKey)
    {
        using (Aes aesInstance = Aes.Create())
        {
            // キーのバイト配列変換と16バイトへのパディング
            byte[] keyBytes = Encoding.UTF8.GetBytes(encryptionKey.PadRight(16, '\0'));
            aesInstance.Key = keyBytes;
            
            aesInstance.Mode = CipherMode.ECB;
            aesInstance.Padding = PaddingMode.PKCS7;

            ICryptoTransform transformer = aesInstance.CreateEncryptor();

            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transformer, CryptoStreamMode.Write))
                {
                    using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
                    {
                        streamWriter.Write(inputText);
                    }
                    return memoryStream.ToArray();
                }
            }
        }
    }
}

調査の結果、この問題は主に暗号化キーの不一致によって引き起こされることが確認されました。

AESアルゴリズムでは最終的にバイト配列として処理されるため、各言語間で生成されるバイト配列が同一であるかを検証する必要があります。まず最初に暗号化モードの統一を確認し、次にキーの一貫性を検証します。

短いキーを使用する際には、同じパディング方式が適用されていることを確認してください。特に空白部分のバイト値が一致しているか注意が必要です。

一方で長めのキーでは切り捨て処理が発生していないか確認が必要です。Pythonでは文字列エンコーディングの違いによりバイト配列の長さが変化する可能性があるため、UTF-8などの統一された文字セットで処理を行うことを推奨します。

タグ: AES encryption Cryptography Python csharp

5月20日 01:00 投稿