tj146780 2021-09-22 18:04 采纳率: 0%
浏览 111
已结题

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 是哪里写得不对吗?

  • 写回答

4条回答 默认 最新

  • 孙叫兽 前端领域优质创作者 2021-09-22 18:42
    关注

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

    评论
    1人已打赏

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月23日
  • 创建了问题 9月22日

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥15 如何修改pca中的feature函数
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况