0

我正在尝试编写 ac# 程序,该程序将使用 API 密钥加密字符串。API 密钥由第三方支付网关生成。该文档是在 java 中提供的,我能够在 java 中加密字符串,但我尝试使用 c# 代码加密字符串,它产生了不同的结果。这是我到目前为止所尝试的。爪哇 -

 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# 代码 -

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);
    }
4

1 回答 1

0

除了 Jon 的言论外,TripleDESCryptoServiceProvider默认为 CBC 模式加密/解密。您需要为 C# 指定 ECB 模式,注意 ECB 模式是不安全的。


实际上,为了提供完全的安全性,对于使用相同密钥的每次加密/解密,密文应该总是不同的。这就是(随机)IV 在 CBC 模式下的用途。


如今,我们尝试使用经过身份验证的密码,例如 AES / GCM,最好在安全协议中使用。例如,使用非 MD5 的安全密钥派生方法。

于 2017-03-24T11:43:21.067 回答