android ios DES加密获得结果不一致

18 篇文章 0 订阅

接手个项目,让登录的时候进行DES加密,服务端同事直接扔过来个DES3.java文件

public class DES3 {

    //密码
    private static final String PASSWORD_CRYPT_KEY = "***";
    //偏移量
    private static final String IV = "***";

    public DES3() {

    }

    /**
     * 加密
     *
     * @param message 密钥,长度必须是8的倍数
     * @return 返回加密后的数据
     * @throws Exception
     */
    public static String encrypt(String message) throws Exception {
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        DESKeySpec desKeySpec = new DESKeySpec(PASSWORD_CRYPT_KEY.getBytes(StandardCharsets.UTF_8));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec iv = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] b = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(b);
    }

    /**
     * 解密
     *
     * @param message 密钥,长度必须是8的倍数
     * @return 返回解密后的原始数据
     * @throws Exception
     */
    public static String decrypt(String message) throws Exception {
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] bytesrc = decoder.decodeBuffer(message);
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        DESKeySpec desKeySpec = new DESKeySpec(PASSWORD_CRYPT_KEY.getBytes(StandardCharsets.UTF_8));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec iv = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] retByte = cipher.doFinal(bytesrc);
        return new String(retByte);
    }

    public static void main(String[] args) throws Exception {
        //加密
        System.out.println("字符串加密:" + DES3.encrypt("oss-test2"));
        //解密
        System.out.println("字符串解密:" + DES3.decrypt("K3DVsW0MCBjbZZKd/YUh8A=="));
    }


}

好高兴啊好高兴,android直接就能用,运行结果和main测试结果一致。

整ios,搜了一大圈,下了好几个三方,计算出来的结果都和java不一样。

在秘钥和偏移量一致的情况下,算出的结果不同,不科学啊。

细看加密源码,发现基本配置都差不多,无非就是配置CCCrypt有区别,比如JKEncrypt的配置:

 ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES, //3DES
                       kCCOptionECBMode|kCCOptionPKCS7Padding, //设置模式
                       vkey,    //key
                       kCCKeySize3DES,
                       vinitVec,     //偏移量,这里不用,设置为nil;不用的话,必须为nil,不可以为@“”
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

配置的都是3DES加密的方式。我又回去看DES3.java,发现里面配置的是DES加密,不是3DES加密,可能被文件名给骗了。

于是把JKEncrypt配置改成DES加密试试:

ccStatus = CCCrypt(kCCDecrypt,
                       kCCAlgorithmDES,
                       kCCOptionPKCS7Padding,
                       vkey,
                       kCCKeySizeDES,
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

计算出来的结果也是:"K3DVsW0MCBjbZZKd/YUh8A=="。

完美!!!

"你笑起来真好看,像春天的花一样~~~~~~~"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值