tomcat中的加密程序需要換到iis中,用起了 C#中的 DESCryptoServiceProvider,上網找了些相關流程寫了個類,感覺比java的程序精簡。
但測試中發現異常,同一次測試中,加密,解密都正常。但把加密的base64字符串,再另外測試就出現“不正確的數據”的提示。
然後再上網對比了很多,沒看到什麼不對的地方。程序如下:
using System;
using System.Security.Cryptography;
using System.Text;
namespace Cproject.capp
{
public static class Crypt
{
private static DESCryptoServiceProvider crypt = new DESCryptoServiceProvider();
private static bool bInit = false;
public static void init()
{
if (bInit == false)
{
bInit = true;
//crypt.IV = Encoding.UTF8.GetBytes("87654321"); //這裏需要添加一行
crypt.Key = Encoding.UTF8.GetBytes("12345678");
crypt.Mode = CipherMode.CBC;
crypt.Padding = PaddingMode.PKCS7;
}
}
public static String encrypt(String str)
{
init();
//用UTF-8編碼,轉爲byte[]
byte[] bysData = Encoding.UTF8.GetBytes(str);
//因為PaddingMode.None的關係, byte[]的長度要是8的倍數
//byte[] bysFixSizeData = new byte[(int)Math.Ceiling(bysData.Length / 8.0) * 8];
//將資料複製到長度為8的倍數的byte[]
//Array.Copy(bysData, bysFixSizeData, bysData.Length);
//進行加密
byte[] bysEncrypted = crypt.CreateEncryptor().TransformFinalBlock(bysData, 0, bysData.Length);
//將byte[]轉為Base64的字串
return Convert.ToBase64String(bysEncrypted);
}
public static String decrypt(String str)
{
init();
byte[] bysData = Convert.FromBase64String(str);
//進行解密
byte[] bysDecrypted = crypt.CreateDecryptor().TransformFinalBlock(bysData, 0, bysData.Length);
return Encoding.UTF8.GetString(bysDecrypted);
}
}
}
若要解密使用其中一個 SymmetricAlgorithm 類加密的數據,必須將 Key 屬性和 IV 屬性設置爲用於加密的相同值。
測試終於成功通過。