当前位置: 首页 > 面试题库 >

C#和Java DES加密值不相同

范哲
2023-03-14
问题内容

我正在尝试使用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);
 }

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

知道为什么它无法按预期工作吗?


问题答案:

问题出在mode加密方面。

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

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

进行以下更改可以解决问题。

// in C# 
DESCryptoServiceProvider alg = new DESCryptoServiceProvider();
alg.Mode = CipherMode.ECB;  // specified

要么

// in java
chiper = Cipher.getInstance("DES/CBC/PKCS5Padding");

双方都不要改变。



 类似资料:
  • 我有相同的数据和加密密钥,相同的算法,相同的模式,但不同的结果。 C#代码: 结果:13A6DAD3119F29A8C4BF6D5BD11564E4E1A93F85B7F2AD9E8E97756688754DE32A23ADE41DFD9F76186D8E25E66D0DCF458ECAA026F16463811C48FC814E50B10FF57FDDB0C0761088D1AC4DDDAE74

  • 问题内容: 我正在使用此代码在Java和Android中加密和解密某些字符串,并且在每个系统中,我得到一个不同的值。 我使用的代码来自http://www.androidsnippets.com/encryptdecrypt- strings (我不会粘贴它,因为它很大)。 例如,在Android中用于加密“ aa”的代码如下:1C6BD31C57F42ACFD0EDD2DD5B7A92CA 和与

  • 我目前正在将我的C#AES-GCM密码代码转换为PHP。然而,经过一些研究,我的PHP系统加密的文本不能被C#one解密。我想知道这两种代码是否有区别: C#带弹跳壳: 下面是PHP系统: 有没有人能告诉我,PHP代码中是否有遗漏或不同之处,导致它们的工作方式有所不同?或者PHP函数和BouncyCastle函数之间是否存在某种内部差异,从而使它们有所不同?

  • 问题内容: 我正在用Objective- C加密一个字符串,并且也在Java中使用AES加密了相同的字符串,并且遇到了一些奇怪的问题。结果的第一部分匹配到某个点,但随后又有所不同,因此当我去将Java的结果解码到iPhone上时,它无法解密。 我正在使用源字符串“现在,这是什么废话。您知道吗?” 使用“ 1234567890123456”键 要加密的Objective-C代码如下:注意:这是一个N