AES和RSA加密的组合使用(二)

作者: Dora404 | 来源:发表于2016-07-29 16:16 被阅读596次

每一个写接口的人都是天使,后来对接的时候折翼了。 ---心疼自己

好几天没有继续更新,主要是被卡在了对接上,已经全部调通,代码还是经得起考验的。
这次主要是关于AES加密的部分,做的一些代码实现,并可以和IOS,安卓端完美对接。

加解密的算法注入方式采用:AES/CBC/PKCS7Padding
测试了多种注入:NoPadding PKCS5Padding PKCS7Padding 等,但是在联调时出现以下问题:
1.IOS只能够使用NoPadding 和 PKCS7Padding 的方式注入,java端可以使用PKCS5Padding(JDK) 或者PKCS7Padding(BC)的方式接受。
2.安卓端代码和java后端代码类似,所有 使用相同的注入方式是是通的,PKCS5Padding(来自JDK) 和PKCS7Padding(来自BC)。NoPadding 未做测试。
3.关于传说中的Linux下安卓端加密由于key生成的方式不同,会在后台解密出现乱码情况。KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128,new SecureRandom());亲测可用。
4.加解密的时候设置偏移量,原因IOS端将偏移量设置为null会出现,解密失败(我不清楚IOS到底有没有不需要偏移量的函数),解决方案安卓IOS后台使用相同的偏移量设置就OK了。
↓↓↓↓↓↓上代码:

package aes;
import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;


/**
 * AES安全编码组件
 * @author zhaofh 2016-07-06
 * @version 1.0
 * @since 1.0
 */
public abstract class AESUtil extends BaseCoder {
    /**
     * ALGORITHM 算法 <br>
     * AES   key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available
     */
    public static final String ALGORITHM = "AES";
     private static String ivParameter = "0102030405060708";//偏移量,可自行修改
    /**
     * 转换密钥<br>
     * 
     * @param key
     * @return
     * @throws Exception
     */
    private static Key toKey(byte[] key) throws Exception {
         SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);
        return secretKey;
    }

    /**
     * 解密
     * 
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decrypt(byte[] data, String key) throws Exception {
        Key k = toKey(AESUtil.decryptBASE64(key));
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding",new BouncyCastleProvider());
//      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
         IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, k,iv);

        return cipher.doFinal(data);
    }

    /**
     * 加密
     * 
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] encrypt(byte[] data, String key) throws Exception {
        Key k = toKey(decryptBASE64(key));
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding",new BouncyCastleProvider());
         IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, k,iv);

        return cipher.doFinal(data);
    }

    /**
     * 生成密钥
     * 
     * @return
     * @throws Exception
     */
    public static String initKey() throws Exception {
        KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        kg.init(128,random);
        //kg.init(128,new SecureRandom());↑↑↑↑↑↑↑↑上两行代码可换成这个
        SecretKey secretKey = kg.generateKey();
        return encryptBASE64(secretKey.getEncoded());
    }   
}

测试类:

package aes;

import ywsoftware.AESCoder;

/**
 * @author zhaofh 2016年7月29日
 *
 */
public class AESTest {  
    public static void main(String[] args) throws Exception {
        String inputStr = "AES";
        String key = AESCoder.initKey();
        System.err.println("原文:\t" + inputStr);

        System.err.println("密钥:\t" + key);

        byte[] inputData = inputStr.getBytes();
        inputData = AESCoder.encrypt(inputData, key);

        System.err.println("加密后:\t" + AESCoder.encryptBASE64(inputData));

        byte[] outputData = AESCoder.decrypt(inputData, key);
        String outputStr = new String(outputData);

        System.err.println("解密后:\t" + outputStr);
    }
}

BaseCode代码戳这里→→→→BaseCode代码
最终选取IOS使用自带的PKCS7Padding方式注入。
以上代码安卓和JAVA通用。
IOS的AES加密代码←←←←IOS的AES加密代码戳这里

下一节讲下,关于加密,JDK BC CC的实现,以Base64为例贴出代码。

相关文章

  • AES和RSA加密的组合使用(二)

    每一个写接口的人都是天使,后来对接的时候折翼了。 ---心疼自己 好几天没有继续更新,主要是被卡在了对...

  • python3中Crypto的AES和RSA

    RSA加密一般使用RSA/ECB/PKCS1Padding(算法/工作模式/填充方式),AES加密一般使用AES/...

  • AES和RSA加密的组合使用

    基于数据传输的安全性,看了些java相关加解密的博客和数据,参考了些某些官方提供的API,做出了如下加密设计:【加...

  • 【RSA】和【AES】加密

    网络请求是数据的传递使用了【RSA】和【AES】加密 需要使用用户信息的请求使用AES加密(需要秘钥进行加密)与用...

  • iOS常用加密算法

    AES(对称加密) 代码: 使用: RSA(非对称加密) 参考文章

  • AES+RSA加密联合使用

    AES+RSA加密联合使用 使用原因: 因为加密解密效率的问题 使用方式前端:前端对需要加密的数据进性AES加密,...

  • android 3DES加密和MD5加密

    经常使用加密算法:DES、3DES、RC4、AES,RSA等;对称加密:des,3des,aes非对称加密:rsa...

  • iOS加密--AES(CBC)和RSA组合加密(避坑)

    遇到的坑 项目中使用AES(CBC)和RSA组合进行加密,但是一直存在加密之后的数据,服务端无法解析,比例小但却是...

  • AES和RSA加密的组合使用(一)

    关于接口安全加解密,做了一些联调,由于工作时间关系,一步步的将使用方法和技巧,实现步骤在简书上发布文章,记录下使用...

  • AES和RSA加密的组合使用(三)

    关于Base64的使用,相对应的可以延伸的了解学习其他相关加密方式的使用方法。 一般加密都可以使用三种加密方式,J...

网友评论

  • 张云龙:加密的烦人之处在于要在iOS,安卓和服务器端达成一致。
    Dora404:@张云龙 如果只是使用对称加密的话,建议使用AES或者PBE加密, DES效率上等等 貌似现在只有银行那些的那种,比较老的项目再用了。我这是使用的非对称和对称一起用,AES+RAS。两个和两端都调通了,并且已经开始加入接口安全了。
    张云龙:@Dora404 我有一个项目采用的DES加密,到现在3端也没有取到一致的加密结果,后续准备换别的加密方式了。
    Dora404:@张云龙 是的呀。。。都是泪。。最终是一定能成功,毕竟那么多人走过的路。。但是 联调都是心酸史呀。。 :sob:

本文标题:AES和RSA加密的组合使用(二)

本文链接:https://www.haomeiwen.com/subject/qaezjttx.html