




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java的非对称性加密服务技术分析鉴于rsa加密的重要性与拖累源代码的匮乏,经过整顿特此贴出。需要下载bcprov-jdk14-123.jar。import javax.crypto.Cipher;import java.security.*;import java.security.spec.RSAPublicKeySpec;import java.security.spec.RSAPrivateKeySpec;import java.security.spec.InvalidKeySpecException;import erfaces.RSAPrivateKey;import erfaces.RSAPublicKey;import java.io.*;import java.math.BigInteger;/* RSA 东西类。供给加密,解密,天生密钥平匀办法。* 需要到下载bcprov-jdk14-123.jar。*/public class RSAUtil /* 天生密钥对* return KeyPair* throws EncryptException*/public static KeyPair generateKeyPair() throws EncryptException try KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA,new vider.BouncyCastleProvider();final int KEY_SIZE = 1024;/没什么好说的了,这个值相干到块加密的大小,可以变幻,然而不要太大,不然服从会低keyPairGen.initialize(KEY_SIZE, new SecureRandom();KeyPair keyPair = keyPairGen.genKeyPair();return keyPair; catch (Exception e) throw new EncryptException(e.getMessage();/* 天生公钥* param modulus* param publicExponent* return RSAPublicKey* throws EncryptException*/public static RSAPublicKey generateRSAPublicKey(byte modulus, byte publicExponent) throws EncryptException KeyFactory keyFac = null;try keyFac = KeyFactory.getInstance(RSA, new vider.BouncyCastleProvider(); catch (NoSuchAlgorithmException ex) throw new EncryptException(ex.getMessage();RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent);try return (RSAPublicKey) keyFac.generatePublic(pubKeySpec); catch (InvalidKeySpecException ex) throw new EncryptException(ex.getMessage();/* 天生私钥* param modulus* param privateExponent* return RSAPrivateKey* throws EncryptException*/public static RSAPrivateKey generateRSAPrivateKey(byte modulus, byte privateExponent) throws EncryptException KeyFactory keyFac = null;try keyFac = KeyFactory.getInstance(RSA, new vider.BouncyCastleProvider(); catch (NoSuchAlgorithmException ex) throw new EncryptException(ex.getMessage();RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus), new BigInteger(privateExponent);try return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec); catch (InvalidKeySpecException ex) throw new EncryptException(ex.getMessage();/* 加密* param key 加密的密钥* param data 待加密的明文数据* return 加密后的数据* throws EncryptException*/public static byte encrypt(Key key, byte data) throws EncryptException try Cipher cipher = Cipher.getInstance(RSA, new vider.BouncyCastleProvider();cipher.init(Cipher.ENCRYPT_MODE, key);int blockSize = cipher.getBlockSize();/失掉加密块大小,如:加密前数据为128个byte,而key_size=1024 加密块大小为127 byte,加密后为128个byte;于是共有2个加密块,第一个127 byte第二个为1个byteint outputSize = cipher.getOutputSize(data.length);/失掉加密块加密后块大小int leavedSize = data.length % blockSize;int blocksSize = leavedSize != 0 ? data.length / blockSize + 1 : data.length / blockSize;byte raw = new byteoutputSize * blocksSize;int i = 0;while (data.length - i * blockSize 0) if (data.length - i * blockSize blockSize)cipher.doFinal(data, i * blockSize, blockSize, raw, i * outputSize);elsecipher.doFinal(data, i * blockSize, data.length - i * blockSize, raw, i * outputSize);/这内中doUpdate办法不可用,查抄源代码后缔造每次doUpdate后并无什么实际行动除了把byte放到ByteArrayOutputStream中,而末了doFinal的时分才将全体的byte发展加密,然而到了此时加密块大小极梗概已经超出了OutputSize所以只好用dofinal办法。i+;return raw; catch (Exception e) throw new EncryptException(e.getMessage();/* 解密* param key 解密的密钥* param raw 已经加密的数据* return 解密后的明文* throws EncryptException*/public static byte decrypt(Key key, byte raw) throws EncryptException try Cipher cipher = Cipher.getInstance(RSA, new vider.BouncyCastleProvider();cipher.init(cipher.DECRYPT_MODE, key);int blockSize = cipher.getBlockSize();ByteArrayOutputStream bout = new ByteArrayOutputStream(64);int j = 0;while (raw.length - j * blockSize 0) bout.write(cipher.doFinal(raw, j * blockSize, blockSize);j+;return bout.toByteArray(); catch (Exception e) throw new EncryptException(e.getMessage();/* param args* throws Exception*/public static void main(String args) throws Exception File file = new File(test.html);FileInputStream in = new FileInputStream(file);ByteArrayOutputStream bout = new ByteArrayOutputStream();byte tmpbuf = new byte1024;int count = 0;while (count = in.read(tmpbuf) != -1) bout.write(tmpbuf, 0, count);tmpbuf = new byte1024;in.close();byte orgData = bout.toByteArray();KeyPair keyPair = RSAUtil.generateKeyPair();RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();byte pubModBytes = pubKey.getModulus().toByteArray();byte pubPubExpBytes = pubKey.getPublicExponent().toByteArray();byte priModBytes = priKey.getModulus().toByteArray();byte priPriExpBytes = priKey.getPrivateExponent().toByteArray();RSAPublicKey recoveryPubKey = RSAUtil.generateRSAPublicKey(pubModBytes,pubPubExpBytes);RSAPrivateKey recoveryPriKey = RSAUtil.generateRSAPrivateKey(priModBytes,priPriExpBytes);byte raw = RSAUtil.encrypt(priKey, orgData);file = new File(encrypt_result.dat);OutputStream out = new FileOutputStream(file);out.write(raw);out.close();byte data = RSAUtil.decrypt(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 光伏电站节能改造与运维服务承包协议
- 废旧金属回收与环保技术研发合作协议
- 智能家居电商3D产品模型设计与用户反馈服务协议
- 跨界新能源汽车电池梯次利用环保产业合作协议
- 购物中心运动品牌区品牌入驻与委托经营合同
- 网络游戏虚拟道具设计版权授权及衍生品开发协议
- 抖音直播平台内容创作者权益保障协议
- 箱包鞋帽五金配件品牌授权与销售合作协议
- 产业园区厂房租赁及人才引进合作协议
- 模具行业技术改造质量检测与改进服务协议
- 六年级上册道德与法治试题-期末简答19题复习 统编版(含答案)
- 三年级美术下册 《多彩的窗户》教学课件
- JJG 700 -2016气相色谱仪检定规程-(高清现行)
- 五方责任主体授权书和承诺书
- 《桂枝香·金陵怀古》ppt课件(沐风学堂)
- 《泵站运行工》word版
- API SPEC 5DP-2020钻杆规范
- 大学无机化学(吉林大学、武汉大学、南开大学版) 第17章 卤素—— 内蒙古民族大学)
- 医院版LIS操作手册(共84页)
- 基于蓄热式加热炉PLC控制系统设计(共43页)
- 瓦楞纸箱检验标准
评论
0/150
提交评论