亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

需要幫助將 C# 加密方法轉換為 Java

需要幫助將 C# 加密方法轉換為 Java

qq_花開花謝_0 2022-10-26 15:55:29
我正在嘗試將現有的 C# 加密方法轉換為 Java,但遇到了如下障礙例如,當我用 c# 加密一個基本字符串“12345”時,我得到這個輸出 8ZQZEURctqP1PMmQxVtCcA==當我用 java 加密相同的字符串時,我得到了這個 jkEZp2cfeGXVE/IxIW6X3g==private static string Encrypt(string plainText, string passPhrase, string saltValue, string hashAlgorithm, int passwordIterations,                        string initVector, int keySize){    try    {        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);        PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);        byte[] keyBytes = password.GetBytes(keySize / 8);        RijndaelManaged symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC };        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);        MemoryStream memoryStream = new MemoryStream();        CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);        cryptoStream.FlushFinalBlock();        byte[] cipherTextBytes = memoryStream.ToArray();        memoryStream.Close();        cryptoStream.Close();        string cipherText = Convert.ToBase64String(cipherTextBytes);        return cipherText;    }    catch (Exception execp)    {        MessageBox.Show(string.Format("Exception in Encrypt function\r\nError: {0}", execp.Message));        return "";    }}下面是我轉換為 java 的內容,但仍然沒有得到相同的加密輸入和輸出 - 我只是將“ProtectPassword”重命名為“Encrypt”,將“UnprotectPassword”重命名為“Decrypt”
查看完整描述

2 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

密文不同,因為PasswordDeriveBytes在 C# 代碼和PBKDF2WithHmacSHA1Java 代碼中生成不同的密鑰:

除了 C#-type 之外PasswordDeriveBytes,還有 C#-type Rfc2898DeriveBytes,它是 PBKDF2 的實現,帶有 SHA-1,因此PBKDF2WithHmacSHA1與 Java 代碼中的對應。

如果可能,Rfc2898DeriveBytes應該在 C# 代碼中使用 代替PasswordDeriveBytes,例如參見此處此處的PBKDF2部分。然后兩個代碼返回相同的密文。

據我所知,沒有提供 C#-type 的 Java 實現的提供程序PasswordDeriveBytes。但是,Internet 上有功能相同的 Java 實現,例如這里。如果 Java 代碼使用這樣的實現而不是PBKDF2WithHmacSHA1,則兩個代碼都返回相同的密文。但正如已經提到的,這應該是第二選擇。


查看完整回答
反對 回復 2022-10-26
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

正如下面所承諾的那樣是解決方案 - 再次感謝您的支持


public static class Encryption

{

    public static string Encrypt(string text)

    {

        var thePassword = "%cFRm*F)N9Rq[6#5";

        byte[] IV = Encoding.UTF8.GetBytes("7!,V5u]Bu>q>7zY'");


        var md5 = new MD5CryptoServiceProvider();

        var password = md5.ComputeHash(Encoding.ASCII.GetBytes(thePassword));

        var cipher = new RijndaelManaged();            

        var encryptor = cipher.CreateEncryptor(password, IV);


        var buffer = Encoding.ASCII.GetBytes(text);

        return Convert.ToBase64String(encryptor.TransformFinalBlock(buffer, 0, buffer.Length));

    }


    public static string Decrypt(string text)

    {

        var thePassword = "%cFRm*F)N9Rq[6#5";

        byte[] IV = Encoding.UTF8.GetBytes("7!,V5u]Bu>q>7zY'");


        var md5 = new MD5CryptoServiceProvider();

        var password = md5.ComputeHash(Encoding.ASCII.GetBytes(thePassword));

        var cipher = new RijndaelManaged();

        var decryptor = cipher.CreateDecryptor(password, IV);


        byte[] input = Convert.FromBase64String(text);

        var newClearData = decryptor.TransformFinalBlock(input, 0, input.Length);

        return Encoding.ASCII.GetString(newClearData);

    }

}

和java等價物


public class Encryption {


    public static String Encrypt(String str)

    {

        try 

        {

            String thePassword = "%cFRm*F)N9Rq[6#5";

            byte[] encryptedData;

            byte[] IV = "7!,V5u]Bu>q>7zY'".getBytes();


            MessageDigest digest = MessageDigest.getInstance("MD5");            

            SecretKeySpec password = new SecretKeySpec(digest.digest(thePassword.getBytes()), "AES");


            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

            IvParameterSpec IVParamSpec = new IvParameterSpec(IV);

            cipher.init(Cipher.ENCRYPT_MODE, password, IVParamSpec);

            encryptedData = cipher.doFinal(str.getBytes());


            return DatatypeConverter.printBase64Binary(encryptedData);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }   


    public static String Decrypt(String str)

    {

        try 

        {

            String thePassword = "%cFRm*F)N9Rq[6#5";

            byte[] encryptedData = DatatypeConverter.parseBase64Binary(str); 

            byte[] IV = "7!,V5u]Bu>q>7zY'".getBytes();


            MessageDigest digest = MessageDigest.getInstance("MD5");            

            SecretKeySpec password = new SecretKeySpec(digest.digest(thePassword.getBytes()), "AES");


            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

            IvParameterSpec IVParamSpec = new IvParameterSpec(IV);

            cipher.init(Cipher.DECRYPT_MODE, password, IVParamSpec);


            byte[] decryptedVal = cipher.doFinal(encryptedData);

            return new String(decryptedVal); 

        } catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }

}


查看完整回答
反對 回復 2022-10-26
  • 2 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號