关于java解密的问题,C#DES加密过的数据,用java解密

问题描述

关于java解密的问题,C#DES加密过的数据,用java解密

C#加密解密代码如下

 public static String sKey = "xxxxxx";
    /// <summary>
    /// 加密
    /// </summary>
    /// <param name="Text"></param>
    /// <returns></returns>
    public static String Encrypt(String EncryptText)
    {
        return Encrypt(EncryptText, sKey);
    }
    /// <summary>
    /// 加密数据
    /// </summary>
    /// <param name="Text"></param>
    /// <param name="sKey"></param>
    /// <returns></returns>
    public static String Encrypt(String Text, String sKey)
    {
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//        DESKeySpec k = new DESKeySpec(sKey.getBytes("UTF-8"));
        byte[] inputByteArray;
        inputByteArray = Encoding.Default.GetBytes(Text);
        des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
        des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(inputByteArray, 0, inputByteArray.Length);
        cs.FlushFinalBlock();
        StringBuilder ret = new StringBuilder();
        foreach (byte b in ms.ToArray())
        {
            ret.AppendFormat("{0:X2}", b);
        }
        return ret.ToString();
    }

    /// <summary>
    /// 解密
    /// </summary>
    /// <param name="Text"></param>
    /// <returns></returns>
    public static String Decrypt(String MD5Text)
    {
        return Decrypt(MD5Text, sKey);
    }
    /// <summary>
    /// 解密数据
    /// </summary>
    /// <param name="Text"></param>
    /// <param name="sKey"></param>
    /// <returns></returns>
    public static String Decrypt(String Text, String sKey)
    {

        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        int len;
        len = Text.Length / 2;
        byte[] inputByteArray = new byte[len];
        int x, i;
        for (x = 0; x < len; x++)
        {
            i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
            inputByteArray[x] = (byte)i;
        }
        des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
        des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(inputByteArray, 0, inputByteArray.Length);
        cs.FlushFinalBlock();
        return Encoding.Default.GetString(ms.ToArray());
    }

我写的解密java代码如下

 private final byte[] DESkey = DigestUtils.md5Hex("xxxxxx").substring(0, 8).getBytes("UTF-8");// 设置密钥
       private final byte[] DESIV = DigestUtils.md5Hex("xxxxxx").substring(0, 8).getBytes("UTF-8");// 设置向量

       private AlgorithmParameterSpec iv = null;// 加密算法的参数接口,IvParameterSpec是它的一个实现
       private Key key = null;

       public CryptoTools() throws Exception {
           DESKeySpec keySpec = new DESKeySpec(DESkey);// 设置密钥参数
           iv = new IvParameterSpec(DESIV);// 设置向量
           SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 获得密钥工厂
           key = keyFactory.generateSecret(keySpec);// 得到密钥对象

       }

       public String decode(String data) throws Exception {
           Cipher deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
           deCipher.init(Cipher.DECRYPT_MODE, key, iv);
           BASE64Decoder base64Decoder = new BASE64Decoder();
           byte[] inputByteArray = base64Decoder.decodeBuffer(data);

           byte[] pasByte = deCipher.doFinal(inputByteArray);

           return new String(pasByte, "UTF-8");
       }
       public static void main(String[] args) {
           try {
               String test = "0608E27EC1E8A308A84E87D1A6FBC3B0";
               CryptoTools des = new CryptoTools();//自定义密钥
               System.out.println("加密前的字符:"+test);
               System.out.println("解密后的字符:"+des.decode(test));
           } catch (Exception e) {
               e.printStackTrace();
           }
       }

测试运行一直报错,求大神解答

javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
    at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)
    at com.walch.wx.util.md5.util.CryptoTools.decode(CryptoTools.java:59)
    at com.walch.wx.util.md5.util.CryptoTools.main(CryptoTools.java:69)
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [util.c:840]

解决方案

java-MD5解密算法

解决方案二:

加解密的编码是否相同,是否都是字节或者字符串

解决方案三:

MD5 是不可逆算法。不能通过密钥来对密文进行解密,解密只能靠暴力破解。
如果需要可逆的加密方法,请考虑使用 DES,3DES,AES,RSA 等。

时间: 2024-10-26 12:53:38

关于java解密的问题,C#DES加密过的数据,用java解密的相关文章

9999:谁有c++版des加密源代码 可以跟java版des加密库匹配 可以互相加解密

问题描述 9999:谁有c++版des加密源代码可以跟java版des加密库匹配可以互相加解密急需:万分感谢!本人在网上已经找了很多个版本,都无法跟java版des库加密出来的结果一致.最好的一个版本是:(40字节的明文(如:100@05963010591062666@013001791717991233)8位的密钥)c++加密出来密文是40个字节.java加密出来的密文是48个字节.前40个字节都是一致的.java加密调用代码如下:[DESKeySpecdks=newDESKeySpec(ra

php中des加密解密&amp;#160;匹配C#des加密解密&amp;#160;对称加密

原文:php中des加密解密 匹配C#des加密解密 对称加密 网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数  可以用于C#和php通信 对数据进行加密,其中$key 是加密密钥,$iv 是偏移量,默认偏移量和加密密匙是一样的, <?php class DES {     var $key;     var $iv; //偏移量          function DES( $key, $iv=0) {     //key长度8例如:1234abcd       

兼容PHP和Java的des加密解密代码分享_php实例

php代码: <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加密 function encrypt($str) { $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MO

Oracle定义DES加密解密及MD5加密函数示例_oracle

(1)DES加密函数 create or replace function encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is v_text varchar2(4000); v_enc varchar2(4000); raw_input RAW(128) ; key_input RAW(128) ; decrypted_raw RAW(2048); begin v_text := rpad( p_text, (trunc

PHP简单实现DES加密解密的方法_php技巧

本文实例讲述了PHP简单实现DES加密解密的方法.分享给大家供大家参考,具体如下: des加密: function des_encrypt($str, $key) { $block = mcrypt_get_block_size('des', 'ecb'); $pad = $block - (strlen($str) % $block); $str .= str_repeat(chr($pad), $pad); return mcrypt_encrypt(MCRYPT_DES, $key, $s

c++-des 加密后密文赋给另一个字符数组,解密出问题

问题描述 des 加密后密文赋给另一个字符数组,解密出问题 我用des加密后,对原始密文解密没有问题. 但是使用这两个函数 void MessageName2::setCiphertxt(const char * ciphertxt_var) { this->ciphertxt_var = ciphertxt_var; } const char * MessageName2::getCiphertxt() const { return ciphertxt_var.c_str(); } 原始数据我

PHP、Java des加密解密实例

  这篇文章主要介绍了PHP.Java des加密解密实例,des加密是对称加密中在互联网应用的比较多的一种加密方式,本文分别给出了PHP和JAVA版本的实现代码,需要的朋友可以参考下 des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展库 下面是加密解密的实例 代码如下: $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_

PHP、Java des加密解密实例_php实例

des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展库 下面是加密解密的实例 复制代码 代码如下: $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);  $key = "This is a very secre

c# java des 互通-(C#转JAVA)DES加密解密问题 。带入整8B加密数据, JAVA写的总是比C#写的多出来8B

问题描述 (C#转JAVA)DES加密解密问题 .带入整8B加密数据, JAVA写的总是比C#写的多出来8B 1C C# private byte[] CSharpEncryptByte(byte[] InputByte byte[] sKey) { DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); DES.Padding = PaddingMode.Zeros; DES.Key = sKey; DES.IV = new