java - C# 中用于 Java DES 加密的等效代码?

标签 java c#

我必须像 java 一样在 c# 中加密数据。 我没有从 c# 得到相同的输出,请指导我哪里做错了

这是java代码

    DESedeKeySpec keyspec
            = new DESedeKeySpec(key.getBytes());
    SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(EncryptionAlgorithm.DESede.name());
    SecretKey deskey = keyfactory.generateSecret(keyspec);

    // Create an 8-byte initialization vector
    byte[] iv = new byte[]{(byte)  0x39,  0x39, 0x39, (byte)  0x39,  0x39,  0x39,  0x39,  0x39};

    IvParameterSpec ivVector = new IvParameterSpec(iv);
    Cipher cipher = Cipher.getInstance(EncryptionAlgorithm.DESede.name() + "/" + EncryptionMode.CBC.name() + "/"
            + EncryptionPadding.PKCS5Padding.name());
    byte[] ciphertext = null;
    try {
        cipher.init(Cipher.ENCRYPT_MODE, deskey, ivVector);
        ciphertext = cipher.doFinal(pass.getBytes());
    } catch (Exception e) {

    }

这是我的 C# 代码..

public string Encrypt(string toEncrypt, bool useHashing,string key)
{
    byte[] keyArray;
    byte[] toEncryptArray = Encoding.ASCII.GetBytes(toEncrypt);
    string retvalue = "";

    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(Encoding.ASCII.GetBytes(key));
        //Always release the resources and flush data
        // of the Cryptographic service provide. Best Practice

        hashmd5.Clear();
    }
    else
        keyArray = Encoding.ASCII.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

    tdes.Key = keyArray;

    tdes.IV = new byte[] { 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39 };
    tdes.Mode = CipherMode.CBC;
    tdes.Padding = PaddingMode.PKCS7;


    using (MemoryStream memoryStream = new MemoryStream())
    {
        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, tdes.CreateEncryptor(keyArray, keyArray), CryptoStreamMode.Write))
        {
            using (StreamWriter writer = new StreamWriter(cryptoStream))
            {
                writer.Write(toEncrypt);
                cryptoStream.FlushFinalBlock();
                writer.Flush();
                retvalue = BitConverter.ToString(memoryStream.GetBuffer(), 0, (int)memoryStream.Length).Replace("-","");
                writer.Close();
            }
            cryptoStream.Close();
        }
        memoryStream.Close();
    }

    return retvalue;
}

最佳答案

您在 C# 版本中以错误的顺序刷新缓冲区。首先刷新 CryptoStream,表示您已完成加密操作,然后刷新 StreamWriter,表示您现在正在写入流,之后您在刷新操作期间完成了最后一个加密 block 。

如果你切换这两个操作,一切都应该有效,但你可以更明确地说明所涉及的操作,而不需要手动刷新和关闭缓冲区,将其留给使用 阻止:

using (MemoryStream memoryStream = new MemoryStream())
{
    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, tdes.CreateEncryptor(keyArray, keyArray), CryptoStreamMode.Write))
    {
        using (StreamWriter writer = new StreamWriter(cryptoStream))
        {
            writer.Write(toEncrypt);
        }

        byte[] buffer = memoryStream.ToArray();
        retvalue = BitConverter.ToString(buffer, 0, buffer.Length).Replace("-", "");
    }
}

关于java - C# 中用于 Java DES 加密的等效代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407881/

相关文章:

c# - WPF和MVVM Light-通过Messenger关闭特定的子窗口

c# - 格式化字符串电话号码 MVC Razor 而不解析为十进制

java - Sun JRE javac 和 Eclipse java 编译器之间的不一致?

java - if语句条件防止空列表?

java - JSF 语言环境问题

c# - 从 PDF 文件创建图像或 PdfTemplate

c# - 当没有使用 Enterprise lib 5.0 提交任何值时,可选输出参数会导致 InvalidOperationException

c# - 使用 WCF 在 Silverlight 中共享服务接口(interface)和模型

java - 来自其他类的 JFrame/JPanel 绘图

java - 两个不同的 jenkins 构建器可以存在于同一个 hpi 中并共享相同的全局配置吗?