亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

叮當貓咪 2023-02-23 14:46:39
我正在努力讓 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");    }   
查看完整描述

1 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

您正在{ (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/PKCS7

BlockSize: 64

barray length: 8

barray: 45 100 170 103 9 249 237 180

barray: LWSqZwn57bQ=

現在唯一的區別是 C# BlockSize 是位,而您的 Java 代碼將它作為字節。


"peanuts"在你的"peanuts\r\n"JDoodle 中改為


Algorithm: DES/CBC/PKCS7Padding

BlockSize: 8

barray length: 16

barray:  107 125 91 -51 77 -50 98 120 -42 -62 64 -89 -128 97 -124 75

barray: a31bzU3OYnjWwkCngGGESw==

這是相同的,如果barray小數內容被打印為無符號值而不是有符號值(將 256 添加到所有負數)——在 Base64 中很容易看出這一事實是相同的。


查看完整回答
反對 回復 2023-02-23
  • 1 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號