C#DES加密和JAVA互通

之前自己解决过JAVA和C# 对称加密的一个问题,由于C#和JAVA都自己开发,比较方便,通过转成16进制解决问题。所以这次也直接尝试通过转16进制看是否能调接口成功。结果失败了(之前自己问题的链接:DES 加密解密C#和JAVA 互通 )。
解决方法
给的JAVA调用示例Demo中使用"DES/ECB/PKCS5Padding"加密,未使用向量iv。
对应C#为 CipherMode.ECB; PaddingMode.PKCS7;
   public byte[] doECBEncrypt(byte[] plainText, int len) throws Exception {        Cipher cipher = this.getCipher("DES", "DES/ECB/PKCS5Padding", 1, (byte[])null);
        byte[] encryptedData = cipher.doFinal(plainText, 0, len);
        return encryptedData;
    } 
 protected Cipher getCipher(String factory, String cipherName, int cryptMode, byte[] iv) throws Exception {
        SecureRandom sr = new SecureRandom();
        byte[] rawKeyData = this.m_desKey;
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(factory);
        SecretKey key = new SecretKeySpec(this.m_desKey, factory);
        Cipher cipher = Cipher.getInstance(cipherName);
        if (iv != null) {
            IvParameterSpec ips = new IvParameterSpec(iv);
            cipher.init(cryptMode, key, ips, sr);
        } else {
            cipher.init(cryptMode, key, sr);
        }
        return cipher;
    }
C#对应如下
        /// <summary> /// 加密字符串           /// </summary>  
        /// <param name="str">要加密的字符串</param>  
        /// <param name="key">秘钥</param>  
        /// <returns>加密后的字符串</returns>  
        public static string Encrypt_ECB(string str, string myKey)
        {
            string encryptKeyall = Convert.ToString(myKey);    //定义密钥  
            if (encryptKeyall.Length < 9)
            {
                for (; ; )
                {
                    if (encryptKeyall.Length < 9)
                        encryptKeyall += encryptKeyall;
                    else
                        break;
                }
            }
            string encryptKey = encryptKeyall.Substring(0, 8);
            DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();
            byte[] key = Encoding.UTF8.GetBytes(encryptKey); //定义字节数组,用来存储密钥 
            byte[] data = Encoding.UTF8.GetBytes(str);//定义字节数组,用来存储要加密的字符串 
            descsp.Key = key;
            descsp.Mode = CipherMode.ECB;
            descsp.Padding = PaddingMode.PKCS7;
            MemoryStream MStream = new MemoryStream(); //实例化内存流对象    
            //使用内存流实例化加密流对象   
            CryptoStream CStream = new CryptoStream(MStream, descsp.CreateEncryptor(key, key), CryptoStreamMode.Write);
            CStream.Write(data, 0, data.Length);  //向加密流中写入数据     
            CStream.FlushFinalBlock();              //释放加密流     
            return Convert.ToBase64String(MStream.ToArray());//返回加密后的字符串  
        }
以上是 C#DES加密和JAVA互通 的全部内容, 来源链接: utcz.com/z/513458.html








