簡體   English   中英

C# 代碼的 AES 加密結果與 Java 的 AES 加密結果不同

[英]AES-Encryption result of C# code is not same as of Java AES-Encryption

我在 Java 中遵循了 aes 加密代碼,我想將它寫在 C# 中,但它沒有給出相同的 output。
Java代碼

public String doEncryptString(String salt, String password,String token) throws CryptoException {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            SecretKeySpec secretKeySpec = generateKeySpec(salt,password);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            byte[] inputBytes = token.getBytes();
            byte[] outputBytes = cipher.doFinal(inputBytes);
            return Base64Utils.encodeToString(outputBytes);
        } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException
                | IllegalBlockSizeException ex) {
            throw new CryptoException("Error encrypting password", ex);
        }
    } 

private SecretKeySpec generateKeySpec(String salt,String password) throws CryptoException{
        try {

        String generatedkey=salt+password;
        byte[] key = generatedkey.getBytes("UTF-8");
        MessageDigest sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16); // use only first 128 bit
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
        return secretKeySpec;
    } catch (NoSuchAlgorithmException | IOException ex) {
        throw new CryptoException("Error encrypting password", ex);
    }
    }

這是我在 C# 中嘗試過的

public static string DoEncrypt(string salt, string password, string token)
        {
            var tdes = new AesManaged();
            tdes.Key = GenerateKey(salt, password);
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;
            ICryptoTransform crypt = tdes.CreateEncryptor();
            byte[] plain = Encoding.UTF8.GetBytes(token);
            byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
            return Convert.ToBase64String(cipher);
        }

        private static byte[] GenerateKey(string salt, string password)
        {
            string generatedkey = $"{salt}{password}";
            var key = Encoding.UTF8.GetBytes(generatedkey);
            var sha1 = SHA1Managed.Create();
            key = sha1.ComputeHash(key);
            return key.Take(16).ToArray(); // use only first 128 bit
        }

要加密的字符串/令牌: ZHKRIWB310XVVWG315PI7UZZWU1V0YYL5WE9JL
Java output: eUjNH8kcgWtlEmuCFHMPwnCFWjy5Pye/gF+itrPs1g8AjtAEZQqlzW/v7kEt2haG
我的 C# 代碼 output: O8sKdJWH+XCOIbexZPEwN5NxWqpWRHC5b3ZsihT8cfBqpI1eVr3PEr9Eq39a5pMn

我不知道我在這里做錯了什么。 任何幫助,將不勝感激。 謝謝

更新

我向大家道歉。 C# 中翻譯的代碼工作正常。 錯誤地,我傳遞了不同的鹽值。 感謝大家。

Java 代碼的 TRANSFORMATION 中有什么?

您還需要使用相同的模式和填充來獲得相同的結果,在您的情況下意味着 ECB 和 PKCS7。

Java 似乎只提供 PKCS5 填充? 但它似乎與PKCS7兼容? 我不是 Java 開發人員,無法提供詳細信息,但這里有一個討論: https://crypto.stackexchange.com/questions/9043/what-is-the-difference-between-pkcs5-padding-and -pkcs7-padding他們說:

一些加密庫(例如 Java 中的 SUN 提供程序)指示 PKCS#5,其中應該使用 PKCS#7 - “PKCS5Padding”應該是“PKCS7Padding”。 這很可能是從只有 8 字節塊密碼(例如(三重)DES 對稱密碼)可用時的遺留物。

順便說一句:生產環境中永遠不要使用 ECB 模式,因為它不安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM