java DES 加密与.net DES 加密 后的结果不一样

java 代码:

 /**
     * 偏移变量,固定占8位字节
     */
    private final static String IV_PARAMETER = "12345678";
    /**
     * 密钥算法
     */
    private static final String ALGORITHM = "DES";
    /**
     * 加密/解密算法-工作模式-填充模式
     */
    private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
    /**
     * 默认编码
     */
    private static final String CHARSET = "utf-8";

    /**
     * 生成key
     *
     * @param password
     * @return
     * @throws Exception
     */
    public Key generateKey(String password) throws Exception {
        DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
        return keyFactory.generateSecret(dks);
    }


    /**
     * DES加密字符串
     *
     * @param password 加密密码,长度不能够小于8位
     * @param data     待加密字符串
     * @return 加密后内容
     */
    public String encrypt(String password, String data) {
        if (password == null || password.length() < 8) {
            throw new RuntimeException("加密失败,key不能小于8位");
        }
        if (data == null)
            return null;
        try {
            Key secretKey = generateKey(password);
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
            byte[] bytes = cipher.doFinal(data.getBytes(CHARSET));

            //JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
            //Android平台可以使用android.util.Base64
            return new String(Base64.getEncoder().encode(bytes));

        } catch (Exception e) {
            e.printStackTrace();
            return data;
        }
    }


我写的.net 加密代码

 public static string EncryptWithJava(string key, string str)
        {
            key = "998c5f7617ab6364";
            str = "{abc123456abc}";
            byte[] IV = Encoding.UTF8.GetBytes("12345678");
            if (key.Length < 8 || string.IsNullOrEmpty(str))
            {
                throw new Exception("加密key小于8或者加密字符串为空!");
            }

            byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0, 8));

            byte[] bIV = IV;

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

            try

            {

                DESCryptoServiceProvider desc = new DESCryptoServiceProvider();

                desc.Padding = PaddingMode.PKCS7;//补位

                desc.Mode = CipherMode.CBC;

                using (MemoryStream mStream = new MemoryStream())

                {

                    using (CryptoStream cStream = new CryptoStream(mStream, desc.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))

                    {

                        cStream.Write(bStr, 0, bStr.Length);

                        cStream.FlushFinalBlock();

                        StringBuilder ret = new StringBuilder();

                        byte[] res = mStream.ToArray();

                        return Convert.ToBase64String(res);

                    }

                }

            }

            catch

            {

                return string.Empty;

            }

        }

java对{abc123456abc} ,秘钥:998c5f7617ab6364加密后:5pFKjYJqQ41T7IFbkzTbEQ==
.net 对{abc123456abc} ,秘钥:998c5f7617ab6364加密后: SqDbUMgK+GwKX93X0ps7jw==
请问一下各位兄弟,.net 是哪里写得不对吗?

可以看下你这个日志,按理来说这两个是可以互通的,看你第二个加密的是不是加密的多次 或者2次,看下日志。

C#需要用到Org.BouncyCastle.Crypto

substring(0,8)好像不对

今天找了java那边的人要了他们那边调用的代码,终于发现了问题

img


他们把key拿着调用了2次generateKey(),第一次在主方法中,第二次在encrypt方法中,所以没有对我来说就不是998c5f7617ab6364了,而是调了一次generateKey()的password.toString() : com.sun.crypto.provider.DESKey@1837e, 把秘钥改一下,,加密出来的就是5pFKjYJqQ41T7IFbkzTbEQ==