C# DES 与 Java DES Byte[] 和 BlockSize 不同

我正在努力让 Java 代码输出与 C# 代码相同的 Byte[]。


C#代码:

using System;

using System.IO;

using System.Security.Cryptography;

using System.Text;


public class Program

{

    private const string k = "A2B3C4D1";

    private const string kiv = "1A2B3C4D";

    

    public static void Main()

    {

        encrypt("peanuts");

    }

    

    public static void encrypt(string str)

    {

        try

        {

            using (var ms = new MemoryStream())

            using (var csp = new DESCryptoServiceProvider() { Key = Encoding.UTF8.GetBytes(k), IV =  Encoding.UTF8.GetBytes(kiv) })

            {

                Console.WriteLine("Algorithm: DES?/" + csp.Mode + "/" + csp.Padding);

                Console.WriteLine("BlockSize: " + csp.BlockSize);


                using (var cs = new CryptoStream(ms, csp.CreateEncryptor(), CryptoStreamMode.Write))

                using (var sw = new StreamWriter(cs))

                    sw.WriteLine(str);


                byte[] barray = ms.ToArray();


                Console.WriteLine("barray length: " + barray.Length);

            

                Console.WriteLine("barray: " + string.Join(" ", barray));

            }

        }

        catch (Exception ex) { Console.Write(ex.ToString()); }

    }

}

Java代码:

import java.io.ByteArrayOutputStream;

import java.nio.charset.Charset;

import java.security.Security;


import javax.crypto.Cipher;

import javax.crypto.CipherOutputStream;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;


public class MyClass {

    private static final String k = "A2B3C4D1";

    private static final String kiv = "1A2B3C4D";

    

    public static void main(String args[]) {

        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());


        encrypt("peanuts");

    }

   

叮当猫咪
浏览 116回答 1
1回答

慕虎7371278

您正在{ (byte)'p', (byte)'e', (byte)'a', (byte)'n', (byte)'u', (byte)'t', (byte)'s', (byte)'\r', (byte)'\n' }使用 C# 和{ (byte)'p', (byte)'e', (byte)'a', (byte)'n', (byte)'u', (byte)'t', (byte)'s' }Java 进行加密。由于“peanuts”是(在 UTF-8 中)7 个字节,它可以被 PKCS7 填充到一个 DES 块中。接下来的 1-8 个字节导致第二个块......你添加了两个。将 Dot.Net Fiddle 中的代码更改为Write而不是WriteLine生成Algorithm: DES?/CBC/PKCS7BlockSize: 64barray length: 8barray: 45 100 170 103 9 249 237 180barray: LWSqZwn57bQ=现在唯一的区别是 C# BlockSize 是位,而您的 Java 代码将它作为字节。"peanuts"在你的"peanuts\r\n"JDoodle 中改为Algorithm: DES/CBC/PKCS7PaddingBlockSize: 8barray length: 16barray:  107 125 91 -51 77 -50 98 120 -42 -62 64 -89 -128 97 -124 75barray: a31bzU3OYnjWwkCngGGESw==这是相同的,如果barray小数内容被打印为无符号值而不是有符号值(将 256 添加到所有负数)——在 Base64 中很容易看出这一事实是相同的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java