提供的 Java 代碼使用 KeyGenerator 搭配 SecureRandom(SHA1PRNG) 從密鑰字串衍生 AES 密鑰,採用 Cipher.getInstance("AES") 預設為 ECB 模式、PKCS5Padding,輸出為大寫十六進位字串。
SecureRandom.setSeed(key.getBytes()) → KeyGenerator.init(128, random)using System;
using System.Security.Cryptography;
using System.Text;
public static class AesEcbUtil
{
///
/// 兼容 Java 端:SHA1PRNG 衍生金鑰 + AES/ECB/PKCS7 + 大寫 Hex 輸出
///
public static string Encrypt(string plainText, string key)
{
// 1. 衍生 16 bytes 金鑰(模擬 Java SHA1PRNG 行為)
byte[] keyBytes = DeriveKey(key, 16);
// 2. AES/ECB/PKCS7 加密
using (Aes aes = Aes.Create())
{
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
aes.Key = keyBytes;
using (ICryptoTransform encryptor = aes.CreateEncryptor())
{
byte[] input = Encoding.UTF8.GetBytes(plainText);
byte[] cipher = encryptor.TransformFinalBlock(input, 0, input.Length);
// 3. 轉大寫 Hex
return ByteArrayToHexString(cipher);
}
}
}
private static byte[] DeriveKey(string key, int keySize)
{
// Java: SecureRandom.getInstance("SHA1PRNG").setSeed(key.getBytes())
// .NET 對應:使用 SHA1 將種子雜湊,取前 keySize bytes
using (SHA1 sha1 = SHA1.Create())
{
byte[] seed = Encoding.UTF8.GetBytes(key);
byte[] hash = sha1.ComputeHash(seed);
byte[] derived = new byte[keySize];
Array.Copy(hash, derived, keySize);
return derived;
}
}
private static string ByteArrayToHexString(byte[] bytes)
{
StringBuilder sb = new StringBuilder(bytes.Length * 2);
foreach (byte b in bytes)
sb.AppendFormat("{0:X2}", b); // 大寫兩位十六進位
return sb.toString();
}
}
plainText、key,C# 輸出應與 Java 完全一致。Cipher.getInstance("AES/CBC/PKCS5Padding"),C# 需同步設定 Mode = CipherMode.CBC 並傳遞 IV。SHA1PRNG 實作可能因提供者不同而有細微差異;若發現不一致,建議雙方改用 PBKDF2(Rfc2898DeriveBytes)統一衍生金鑰。若不想處理跨平台加密細節,可將 Java 加密邏輯封裝為 REST API(如 /api/encrypt),C# 僅發送 HTTP 請求獲取密文。優點:零移植風險;缺點:增加網路延遲與單點故障。