我正在尝试编写一个使用API密钥加密字符串的c#程序。 API密钥由第三方支付网关生成。文档是在java中提供的,我能够加密java中的字符串,但我尝试使用c#代码加密字符串,它生成了不同的结果。这是我到目前为止所尝试的。 java -
public static String harden(String unencryptedString) throws NoSuchAlgorithmException, UnsupportedEncodingException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
String key ="***************";
MessageDigest md = MessageDigest.getInstance("md5");
byte[] digestOfPassword = md.digest(key.getBytes("utf-8"));
byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}
SecretKey secretKey = new SecretKeySpec(keyBytes, "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] plainTextBytes = unencryptedString.getBytes("utf-8");
byte[] buf = cipher.doFinal(plainTextBytes);
byte[] base64Bytes;
base64Bytes = Base64.getEncoder().encode(buf);
String base64EncryptedString = new String(base64Bytes);
return base64EncryptedString;
}
c#code -
public TripleDES CreateDES(string key)
{
MD5 md5 = new MD5CryptoServiceProvider();
TripleDES des = new TripleDESCryptoServiceProvider();
des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
des.IV = new byte[des.BlockSize / 8];
return des;
}
public byte[] Encryption(string PlainText, string key)
{
TripleDES des = CreateDES(key);
ICryptoTransform ct = des.CreateEncryptor();
byte[] input = Encoding.Unicode.GetBytes(PlainText);
return ct.TransformFinalBlock(input, 0, input.Length);
}
答案 0 :(得分:0)
除了Jon的评论之外,TripleDESCryptoServiceProvider
默认为CBC模式加密/解密。您需要为C#指定ECB模式,注意ECB模式是不安全的。
实际上,为了提供完全的安全性,使用相同密钥的每个加密/解密的密文应总是不同的。这就是(随机)IV在CBC模式下的用途。
现在我们尝试使用经过身份验证的密码,例如AES / GCM,最好是在安全协议中。例如,使用不是MD5的安全密钥派生方法的那个。