//1,获取cipher 对象 Cipher cipher = Cipher.getInstance("RSA"); //2,通过秘钥对生成器KeyPairGenerator 生成公钥和私钥 KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair(); //使用公钥进行加密,私钥进行解密(也可以反过来使用) PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); //3,使用公钥初始化密码器 cipher.init(Cipher.ENCRYPT_MODE, publicKey); //4,执行加密操作 byte[] result = cipher.doFinal(content.getBytes()); //使用私钥初始化密码器 cipher.init(Cipher.DECRYPT_MODE, privateKey); //执行解密操作 byte[] deResult = cipher.doFinal(result);
//一次性加密数据的长度不能大于117 字节 private static final int ENCRYPT_BLOCK_MAX = 117; //一次性解密的数据长度不能大于128 字节 private static final int DECRYPT_BLOCK_MAX = 128;
/** * 分批操作 * * @param content 需要处理的数据 * @param cipher 密码器(根据cipher 的不同,操作可能是加密或解密) * @param blockSize 每次操作的块大小,单位为字节 * @return 返回处理完成后的结果 * @throws Exception */ public static byte[] doFinalWithBatch(byte[] content, Cipher cipher, int blockSize) throwseption { int offset = 0;//操作的起始偏移位置 int len = content.length;//数据总长度 byte[] tmp;//临时保存操作结果 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //如果剩下数据 while (len - offset > 0) { if (len - offset >= blockSize) { //剩下数据还大于等于一个blockSize tmp = cipher.doFinal(content, offset, blockSize); }else { //剩下数据不足一个blockSize tmp = cipher.doFinal(content, offset, len - offset); } //将临时结果保存到内存缓冲区里 baos.write(tmp); offset = offset + blockSize; } baos.close(); return baos.toByteArray(); }
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用:Bluedaquiri 发表于 2018-06-20 14:59 @JackJiang 我想请教一个问题,RSA加密在数据比较长的情况下比较耗时,那么如果我加密这段数据的100个字节 ...
引用:JackJiang 发表于 2018-06-20 15:20 理论上可以,你可以写个demo试试
引用:Bluedaquiri 发表于 2018-06-20 15:34 @JackJiang 感谢回复,在社区中帖子中有介绍通过服务器与客户端各自交换公钥来完成RSA加密的方式,我想把 ...
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.156250 second(s), 43 queries , Gzip On.