java c# 加密与解密对照

原文 java c# 加密与解密对照

最近一直烦恼,java , c# 加密的不同,然后整理了一下,留个备份的轮子:

其中在 java、c#加密转换时,最重要的是 IV 的确定,我常常用如下方法使得java和c#之间的 IV 可以转换: 
将其中某个 IV 数组转为 10进制后,在转换为相应的 byte数组就好了。10进制数组成为 java、c# 中IV转换的桥梁了。最后分别有java(我用myeclipse)和c#的编译器(SharpDevelop2很轻量级的编译器,但是运行代码后需要在后面写上 "Console.ReadLine(); " ,不然dos框会一闪而过。这个编译器还需要系统中安装有.net 2.0或者其他版本)多多实践,这样可以更加直接的看到结果。 下面实例中java与c#的代码都是一一对应的:当然,这些加密算法并不适合所有的加密结构,但是重要的是 IV 、key 的格式化。 网上查了资料,找到java转换为16进制的方法(已测)

Java代码  

  1. // java格式化16进制输出
  2. public static void formatIntTo16(byte[] bytes) {
  3. String[] resultBytes = new String[bytes.length];
  4. for (int i = 0; i < bytes.length; i++) {
  5. resultBytes[i] = Integer.toHexString(bytes[i] & 0xFF);
  6. }
  7. }

Java代码  

  1. //MD5加密
  2. public static String md5Encode(String strContent) {
  3. try {
  4. MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  5. byte[] tempBytes =  messageDigest.digest(strContent.getBytes("UnicodeLittleUnmarked"));
  6. StringBuffer stringBuffer = new StringBuffer();
  7. for(byte bytes: tempBytes) {
  8. String tempByte = Integer.toHexString(bytes & 0xFF);
  9. if(tempByte.length() == 1) {
  10. stringBuffer.append("0");
  11. }
  12. stringBuffer.append(tempByte);
  13. }
  14. return stringBuffer.toString();
  15. } catch(Exception e) {
  16. e.printStackTrace();
  17. }
  18. return null;
  19. }

C#代码  

  1. //md5加密
  2. public static void MD5(string str) {
  3. string cl1 = str;
  4. string pwd = "";
  5. System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
  6. byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));
  7. for (int i = 0; i < s.Length; i++) {
  8. pwd = pwd + s[i].ToString("x");
  9. }
  10. Console.Write(pwd);
  11. Console.WriteLine();
  12. }

Java代码  

  1. // 3DES加密 基方法
  2. public static byte[] des3EncodeCBC(byte[] data, byte[] key) throws Exception {
  3. Key deskey = null;
  4. DESedeKeySpec spec = new DESedeKeySpec(key);
  5. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
  6. deskey = keyfactory.generateSecret(spec);
  7. Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
  8. IvParameterSpec ips = new IvParameterSpec(IV);
  9. cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
  10. return cipher.doFinal(data, 0, data.length);
  11. }

C#代码  

  1. // 3DES加密算法
  2. private static bool Encrypt( byte[] key, byte[] input, out byte[] output )
  3. {
  4. output = null;
  5. try
  6. {
  7. TripleDESCryptoServiceProvider trippleDesProvider = new TripleDESCryptoServiceProvider();
  8. ICryptoTransform encryptObj = trippleDesProvider.CreateEncryptor(rkey, IV);
  9. output = encryptObj.TransformFinalBlock(input, 0, input.Length);
  10. trippleDesProvider.Clear();
  11. }
  12. catch (Exception)
  13. {
  14. return false;
  15. }
  16. return true;
  17. }

Java代码  

  1. // 3DES 解密 基方法
  2. public static byte[] des3DecodeCBC(byte[] data, byte[] key) throws Exception {
  3. Key deskey = null;
  4. DESedeKeySpec spec = new DESedeKeySpec(key);
  5. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("desede");
  6. deskey = keyFactory.generateSecret(spec);
  7. Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
  8. IvParameterSpec ips = new IvParameterSpec(IV);
  9. cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
  10. return cipher.doFinal(data, 0, data.length);
  11. }

C#代码  

  1. // 3DES 解密 基方法
  2. private static bool Decrypt(byte[] key, byte[] input, out byte[] output)
  3. {
  4. output = null;
  5. try
  6. {
  7. TripleDESCryptoServiceProvider trippleDesProvider = new TripleDESCryptoServiceProvider();
  8. ICryptoTransform decryptObj = trippleDesProvider.CreateDecryptor(key, IV);
  9. output = decryptObj.TransformFinalBlock(input, 0, input.Length);
  10. trippleDesProvider.Clear();
  11. }
  12. catch (Exception ex)
  13. {
  14. return false;
  15. }
  16. return true;
  17. }

Java代码  

  1. //DES加密
  2. public static String encode(byte[] key, byte[] iv, byte[] data) throws Exception {
  3. Key deskey = null;
  4. DESKeySpec spec = new DESKeySpec(key);
  5. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  6. deskey = keyFactory.generateSecret(spec);
  7. IvParameterSpec ips = new IvParameterSpec(iv);
  8. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  9. cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
  10. return new BASE64Encoder().encode(cipher.doFinal(data, 0, data.length));
  11. }

C#代码  

    1. //DES加密
    2. public static string DESEncode(string encryptString, string encryptKey) {
    3. byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
    4. byte[] rgbIV = DESKeys;
    5. byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
    6. DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
    7. MemoryStream mStream = new MemoryStream();
    8. CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV),
    9. CryptoStreamMode.Write);
    10. cStream.Write(inputByteArray, 0, inputByteArray.Length);
    11. cStream.FlushFinalBlock();
    12. return Convert.ToBase64String(mStream.ToArray());
    13. }
时间: 2024-08-28 01:21:46

java c# 加密与解密对照的相关文章

Java密码加密与解密

Java密码加密与解密 Java中对代码进行加密与解密,其中用MD5方式的是不可逆的.   import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import

Java DES 加密和解密

DES算法简介DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法.DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密. 项目中的加密和解密工具类: public class DesUtils { public final static String DES = "DES"; pub

java字符串加密与解密

原文:java字符串加密与解密 源代码下载地址:http://www.zuidaima.com/share/1557602896464896.htm 这段时间正好系统中有需要对密码进行加密,还要能进行解密,支持自定义密钥.现分享给大家,希望能帮助到牛牛们. 有些人可能会遇到com.sun.crypto.provider.SunJCE报错,是由于编译器(jdk1.7以下)对必须得库有一定的限制,因此无法构造改函数,解决方法是设置一下编译器的报错级别,具体的解决方法可以参照这篇文章: http://

Java Base64加密、解密原理Java代码

Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为

Java DES 加密和解密源码

Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互作用性. 算法的独立性是通过定义密码服务类来获得.用户只需了解密码算法的概念,而不用去关心如何实现这些概念.实现的独立性和相互作用性通过密码服务提供器来实现.密码服务提供器是实现一个或多个密码服务的一个或多个程序包.软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器.安装和配置提供器,可将包含提供器的ZIP和JAR文件放在CLASSPATH下,再编辑Java安全属性文件来

[Java 安全]加密、解密与数字签名

引言 本文使用的密码学术语请见术语章节. Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别. Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的ASCII字符序列,常用在需用通过文本协议(比如HTTP和SMTP)来传输二进制数据的情况下.Base64并不是加密解密算法,尽管我们有时也听到使用Base64来加密解密的说法,但这里所说的加密与解密实际是指编码(encode)和解码(decode)的过程,其

C# 与 Java Rsa加密与解密互通

Rsa 加密标准的制定已经过去了十多年了. 这两天在看rsa 加密的文章,基本上都是在说 .net 与 java 之间的 rsa加密是不能互通的.因为项目有用到,所以花了点时间对rsa加密做了一点点了解,发现,不管是java 还是 C# 都对 rsa 的标准加密进行了实现, 是 对于标准是实现,不能互通就讲不过去了. 今天特意写了一段java 代码试了一下,发现是完全可以的. 密钥的描述: C#(.net) 中有三种方式导出密钥,一种是blob,一种是 xml 另一种是参数,其中xml 的方式是

Java aes加密C#解密的取巧方法

摘要: 项目开发过程中遇到一个棘手的问题:A系统使用java开发,通过AES加密数据,B系统使用C#开发,需要从A系统获取数据,但在AES解密的时候遇到麻烦.Java的代码和C#的代码无法互通. Java代码: /** * 加密 * * @param content 需要加密的内... 项目开发过程中遇到一个棘手的问题:A系统使用java开发,通过AES加密数据,B系统使用C#开发,需要从A系统获取数据,但在AES解密的时候遇到麻烦.Java的代码和C#的代码无法互通. Java代码: /**

java之--加密、解密算法

0.概述 在项目开发中,我们常需要用到加解密算法,加解密算法主要分为三大类: 1.对称加密算法,如:AES.DES.3DES 2.非对称加密算法,如:RSA.DSA.ECC 3.散列算法,如:MD5.SHA1.HMAC 1.各算法对比 不废话,直接开表格对比: 对称加密算法(加解密密钥相同) 名称 密钥长度 运算速度 安全性 资源消耗 DES 56位 较快 低 中 3DES 112位或168位 慢 中 高 AES 128.192.256位 快 高 低 非对称算法(加密密钥和解密密钥不同) 名称