C#和Java DES加密值不相同

Nik*_*aul 2 c# java encryption cryptography

我试图在C#和Java中加密相同的数据.如果数据超过7个字节,则Java和C#加密值不相同.

  • 输入1:
    java的输出:FrOzOp/2Io8 =
    C#输出:FrOzOp/2Io8 =

  • 输入2:abc
    j:H9A/ahl8K7I =
    c#:H9A/ahl8K7I =

  • 输入3:aaaaaaaa (问题)
    j:Gxl7e0aWPd7j6l7uIEuMxA ==
    c#:Gxl7e0aWPd7sf1xR6hK4VQ ==

这是C#和Java方法的实现.
C#代码:

public String saltTxt = "12345678";
public String Encrypt(String txt)
{
        byte[] data = Encrypt(Encoding.UTF8.GetBytes(txt));

        DESCryptoServiceProvider alg = new DESCryptoServiceProvider();

        alg.Key = Encoding.UTF8.GetBytes(saltTxt.ToCharArray(), 0, cprovider.KeySize / 8);
        alg.IV = new byte[8];

        MemoryStream ms = new MemoryStream();
        CryptoStream stem = new CryptoStream( ms, cprovider.CreateEncryptor(),CryptoStreamMode.Write);

        stem.Write(txt, 0, txt.Length);
        stem.FlushFinalBlock();

        data = ms.ToArray();

        return Convert.ToBase64String(data);
 }
Run Code Online (Sandbox Code Playgroud)

Java代码:

public String saltTxt = "12345678";
public String Encrypt(String str) {
    try {
        KeySpec myKey = new DESKeySpec(saltTxt.getBytes("UTF8"));
        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(myKey);
        Cipher ecipher = Cipher.getInstance("DES");
        ecipher.init(Cipher.ENCRYPT_MODE, key);

        byte[] data = str.getBytes("UTF8");

        byte[] crypt = ecipher.doFinal(data);

        return new BASE64Encoder().encode(crypt);
    } catch (Exception ex) {
    }

    return null;
} 
Run Code Online (Sandbox Code Playgroud)

知道为什么它没有像预期的那样工作吗?

Nik*_*aul 8

问题在于mode加密.

SunJCE提供程序ECB用作默认模式,并PKCS5Padding用作DES,DES-EDE和Blowfish密码的默认填充方案.(JCA Doc)

In .Net,对称算法的默认操作模式是CipherMode.CBC默认填充PaddingMode.PKCS7.(msdn..SymmetricAlgorithm)

以下更改解决了问题.

// in C# 
DESCryptoServiceProvider alg = new DESCryptoServiceProvider();
alg.Mode = CipherMode.ECB;  // specified 
Run Code Online (Sandbox Code Playgroud)

要么

// in java
chiper = Cipher.getInstance("DES/CBC/PKCS5Padding");
Run Code Online (Sandbox Code Playgroud)

不要改变双方.