主要差异如下:

1、  对于待加密解密的数据,各自的填充模式不一样

C#的模式有:ANSIX923、ISO10126、None、PKCS7、Zero,而Java有:NoPadding、PKCS5Padding、SSL3Padding

2、  各自默认的3DES实现,模式和填充方式不一样

C#的默认模式为CBC,默认填充方式为PKCS7; java的默认模式为ECB,默认填充方式为PKCS5Padding

3、  各自的key的size不一样

C#中key的size为16和24均可;java中要求key的size必须为24;对于CBC模式下的向量iv的size两者均要求必须为8

翻看了3DES的原理:

DES主要采用替换和移位的方法,用56位密钥对64位二进制数据块进行加密,每次加密可对64位的输入数据进行16轮编码,

经一系列替换和移位后,输入的64位转换成安全不同的64的输出数据

.

3DES:是在DES的基础上采用三重DES,即用两个56位的密钥K1,K2,发送方用K1加密,K2解密,再使用K1加密.接收方使用K1解密,K2加密,再使用K1解密,

其效果相当于密钥长度加倍.

于是尝试在java中,对key进行补位,即用前8个字节作为byte[24] 中的byte[16]~byte[23];发现与c#中加密的结果相同!于是大胆假设C#中可能是检查key的size为16的时候

自动将前8个字节作为k3进行了补位,而java没有实现这一点(因为java的3DES算法中强制要求key的size必须为24)。这样的情况下,可能就是发送方用k1加密、k2解密、k3再加密;接受方k3解密、k2加密、再k1解密来实现。

最终经过编码验证,确认key大小为24时,java和c#的加密解密结果相一致。

Java中实现时,只要注意对大小不足24的key进行补位,和采用CBC模式,填充模式为PKCS5Padding即可。

C#中的实现:

public void test()

{

SymmetricAlgorithm des = new TripleDESCryptoServiceProvider();

des.Key = Encoding.UTF8.GetBytes("wserrtyuiop12fer");

des.IV = Encoding.UTF8.GetBytes("12345678");

string str = "test";

byte[] byt = Encoding.UTF8.GetBytes(str);

MemoryStream ms = new MemoryStream();

ICryptoTransform ct = mCSP.CreateEncryptor(des.Key, des.IV);

CryptoStream  cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);

cs.Write(byt, 0, byt.Length);

cs.FlushFinalBlock();

cs.Close();

string enctext64=Convert.ToBase64String(ms.ToArray());

Console.Out.WriteLine("enctext64: {0}", enctext64);

}

Java中的实现:

public static void main(String[] args) {

try {

byte[] key = "wserrtyuiop12fercsffswqh".getBytes();

byte[] iv = "12345678".getBytes();

String s = "test";

s="9EC610E687CA2642147F3BB1779E1C56:820124";

BASE64Decoder base64decoder = new BASE64Decoder();

BASE64Encoder base64encoder = new BASE64Encoder();

iv = base64decoder.decodeBuffer("H06BDKgg/kI=");

byte[] bt = base64decoder.decodeBuffer("nsYQ5ofKJkIUfzuxd54cVg==");

System.out.println("original key size:" + bt.length);

byte[] kbt = new byte[bt.length + 8];

System.arraycopy(bt, 0, kbt, 0, bt.length);

System.arraycopy(bt, 0, kbt, 16, 8);

System.out.println("key base64: " + base64encoder.encode(kbt));

key=kbt;

System.out.println("key size:" + key.length);

String result = encryptWithIV(key, iv, s);

System.out.println("encrypt result: " + result);

} catch (Exception e) {

e.printStackTrace();

}

}

public static String encryptWithIV(byte[] key, byte[] iv, String str) throws Exception {

SecureRandom sr = new SecureRandom();

DESedeKeySpec dks = new DESedeKeySpec(key);

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");

SecretKey securekey = keyFactory.generateSecret(dks);

IvParameterSpec ips = new IvParameterSpec(iv);

Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, securekey, ips, sr);

byte[] bt = cipher.doFinal(str.getBytes("utf-8"));

System.out.println("encrypt base64: " + new BASE64Encoder().encode(bt));

return new String(Hex.encodeHex(bt));

}

还有一种让Java和.Net兼容的方式,在.Net中指定模式为ECB,填充为PKCS7,然后在Java中采用其默认的模式(DESede/ECB/PKCS5Padding)即可,注意双方约定key的size为24个字节。建议双方对key以base64编码字符串进行告知,因为java和.net中byte字节的范围不相同(前者-128~127,后者0~255),避免不必要的处理。

java .net 3des_Java.net3DES差异及互通相关推荐

  1. 【ECDH java后端和javaScript前后端互通实现】

    ECDH java后端和javaScript前后端互通实现 问题背景 ECDH算法 Java 实现 前端JavaScript 实现 问题背景 web前端和后端之间的通信不一定可靠,如果不方便使用预共享 ...

  2. 【Hadoop】新旧Java MapReduce API的差异

    Hadoop在0.20.0版本中第一次使用新的API,部分早期的0.20.0版本不支持使用旧的API,但在接下来的1.x和2.x版本中新旧API都可以使用. 新旧API的差异主要有以下几点: 1. 新 ...

  3. java mvel_Drools:mvel和Java方言之间的差异

    MVEL是Apache许可的功能强大的表达语言(EL),用Java编写,用于基于Java的应用程序,因此其语法与Java相似. > MVEL表达式干净,其语法易于理解. > Apache流 ...

  4. java c 3des_java中的3DES加密

    java中的3DES加密,上代码: package com.picc.custportrait.utils.decode; import java.io.ByteArrayOutputStream; ...

  5. Java语言与C++语言在作用域上的差异

    Java语言与C++语言是目前最流行的编程语言.两者的编程思想虽然有一定的共同性,但是在很多方面仍然存在着比较大的差异.如两者在作用域上仍然存在着很大的差异.下面笔者就分析一下这两门语言在作用域上的差 ...

  6. ice 服务java连接,“先进的互联互通技术”–使用ice联通php和java [part 1 server]

    PHP没有中间件,导致了对很多麻烦.比如,对数据库的操作必须要链接数据库,然后做SQL操作.WEB程序直接操作数据库的方法,这样会带来很多人为因素的事故隐患,以及管理上的麻烦,尤其是对大型的网站应用来 ...

  7. Android平台和java平台 DES加密解密互通程序及其不能互通的原因

    为什么80%的码农都做不了架构师?>>>    网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DE ...

  8. php java rsa_java和php实现RSA加密互通-b

    java和PHP RSA加密实现互通 1:通过openssl 生成公钥和密钥文件(linux) (1)  生产私钥文件命令 openssl genrsa -out rsa_private_key.pe ...

  9. java 文本差异对比高亮工具(基于谷歌文本比对工具)

    直接上代码: package *.*.*.util;import com.zdww.cd.mrs.biz.internal.constants.DiffMatchPatch; import com.z ...

最新文章

  1. 《从零开始学Swift》学习笔记(Day 47)——final关键字
  2. 熬夜彻底搞懂Cookie Session Token JWT
  3. 缅怀袁隆平院士:一颗稻谷里的爱国情怀
  4. 我的Go语言学习之旅八:创建一个简单的WEB服务器
  5. 求凸包(两遍扫描,求上下凸包的方法)
  6. .Net架构必备工具列表
  7. (第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
  8. 学习中碰到的一些优化工具包和库
  9. Oracle 12C -- 预定义audit policies
  10. python自动复制,Python数组自动相互复制
  11. 青岛农业大学计算机分数线,青岛农业大学录取分数线2021是多少分(附历年录取分数线)...
  12. java生成流程图_java源代码转换为流程图
  13. 【毕业设计】大数据分析的客户细分 (聚类分析) - python k-means
  14. 全面解析大数据解决方案的架构层
  15. Java 一个数字、字母、汉字各占几个字节
  16. python KS-检验(Kolmogorov-Smirnov test) -- 检验数据是否符合某种分布
  17. 第三章 part3 几个小知识点
  18. 双指针之两数之和,三数之和,N数之和系列
  19. Java实现三国曹操华容道的游戏
  20. 基于Echarts构建大数据招聘岗位数据可视化大屏

热门文章

  1. mysql goldengate_goldengate同步mysql
  2. 技术员联盟win11系统64位专业版镜像v2021.08
  3. win7系统5分钟自动注销的解决方法
  4. 腾讯视频电脑版下载_腾讯视频~如何用腾讯视频
  5. php并发取源码,PHP读取大文件源码示例-Swoole多进程读取大文件
  6. dev c++调试怎么看变量的值_利用GDB调试 MSQL
  7. try catch finally 中包含return的几种情况,及返回结果
  8. 发明喂饭机器人_人类又懒出新高度,老美发明自动喂饭机器人,“君子”动嘴不动手...
  9. mysql查询姓王的信息代码_MySQL查询语句练习题
  10. java虚拟机1.7_《Java虚拟机原理》7.1 精选 —— 总览