位置: 编程技术 - 正文

RSA加密解密及数字签名Java实现(rsa加解密过程是什么)

编辑:rootadmin
RSA加密解密及数字签名Java实现

推荐整理分享RSA加密解密及数字签名Java实现(rsa加解密过程是什么),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:rsa 加密,rsa加密解密数学原理,rsa加密和解密过程,rsa加密与解密,rsa加密解密流程图,rsa加密解密原理及流程,rsa加密解密数学原理,rsa加密解密数学原理,内容如对您有帮助,希望把文章链接给更多的朋友!

RSA公钥加密算法是年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密算法。

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

关于RSA算法的原理,这里就不再详加介绍,网上各种资源一大堆。下面就开始介绍RSA加密解密JAVA类的具体实现。

?importjava.security.MessageDigest; importsun.misc.BASEDecoder;importsun.misc.BASEEncoder; publicclass Coder { publicstatic final String KEY_SHA="SHA"; publicstatic final String KEY_MD5="MD5"; /** * BASE解密 * @param key * @return * @throws Exception */ publicstatic byte[] decryptBASE(String key) throwsException{ return(newBASEDecoder()).decodeBuffer(key); } /** * BASE加密 * @param key * @return * @throws Exception */ publicstatic String encryptBASE(byte[] key)throwsException{ return(newBASEEncoder()).encodeBuffer(key); } /** * MD5加密 * @param data * @return * @throws Exception */ publicstatic byte[] encryptMD5(byte[] data)throwsException{ MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); md5.update(data); returnmd5.digest(); } /** * SHA加密 * @param data * @return * @throws Exception */ publicstatic byte[] encryptSHA(byte[] data)throwsException{ MessageDigest sha = MessageDigest.getInstance(KEY_SHA); sha.update(data); returnsha.digest(); }}

先提供Coder编码类,该类封装了基本的Base、md5和SHA加密解密算法。Java对这些算法的实现提供了很好的API封装,开发人员只需调用这些API就可很简单方便的实现数据的加密与解密。

下面提供RSA加密解密类,该类为Coder类子类,因为其中对RSA公私密钥的保存进行了一层Base加密处理。

RSA加密解密类静态常量

? publicstatic final String KEY_ALGORTHM="RSA";//publicstatic final String SIGNATURE_ALGORITHM="MD5withRSA"; publicstatic final String PUBLIC_KEY = "RSAPublicKey";//公钥publicstatic final String PRIVATE_KEY = "RSAPrivateKey";//私钥

RSA加密解密的实现,需要有一对公私密钥,公私密钥的初始化如下:

?/** * 初始化密钥 * @return * @throws Exception */ publicstatic Map<String,Object> initKey()throwsException{ KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORTHM); keyPairGenerator.initialize(); KeyPair keyPair = keyPairGenerator.generateKeyPair(); //公钥 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); //私钥 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String,Object> keyMap = newHashMap<String, Object>(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); returnkeyMap; }

从代码中可以看出密钥的初始化长度为位,密钥的长度越长,安全性就越好,但是加密解密所用的时间就会越多。而一次能加密的密文长度也与密钥的长度成正比。一次能加密的密文长度为:密钥的长度/8-。所以bit长度的密钥一次可以加密的密文为/8-=bit。所以非对称加密一般都用于加密对称加密算法的密钥,而不是直接加密内容。对于小文件可以使用RSA加密,但加密过程仍可能会使用分段加密。

从map中获取公钥、私钥

?/** * 取得公钥,并转化为String类型 * @param keyMap * @return * @throws Exception */ publicstatic String getPublicKey(Map<String, Object> keyMap)throwsException{ Key key = (Key) keyMap.get(PUBLIC_KEY); returnencryptBASE(key.getEncoded()); } /** * 取得私钥,并转化为String类型 * @param keyMap * @return * @throws Exception */ publicstatic String getPrivateKey(Map<String, Object> keyMap) throwsException{ Key key = (Key) keyMap.get(PRIVATE_KEY); returnencryptBASE(key.getEncoded()); }RSA加密解密及数字签名Java实现(rsa加解密过程是什么)

对于RSA产生的公钥、私钥,我们可以有两种方式可以对信息进行加密解密。私钥加密-公钥解密 和 公钥加密-私钥解密。

私钥加密

?/** * 用私钥加密 * @param data 加密数据 * @param key 密钥 * @return * @throws Exception */ publicstatic byte[] encryptByPrivateKey(byte[] data,String key)throwsException{ //解密密钥 byte[] keyBytes = decryptBASE(key); //取私钥 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = newPKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); //对数据加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateKey); returncipher.doFinal(data); }

私钥解密

?/** * 用私钥解密<span style="color:#;"></span> * @param data 加密数据 * @param key 密钥 * @return * @throws Exception */ publicstatic byte[] decryptByPrivateKey(byte[] data,String key)throwsException{ //对私钥解密 byte[] keyBytes = decryptBASE(key); PKCS8EncodedKeySpec pkcs8EncodedKeySpec = newPKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); //对数据解密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateKey); returncipher.doFinal(data); } 公钥加密?/** * 用公钥加密 * @param data 加密数据 * @param key 密钥 * @return * @throws Exception */ publicstatic byte[] encryptByPublicKey(byte[] data,String key)throwsException{ //对公钥解密 byte[] keyBytes = decryptBASE(key); //取公钥 XEncodedKeySpec xEncodedKeySpec = newXEncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); Key publicKey = keyFactory.generatePublic(xEncodedKeySpec); //对数据解密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); returncipher.doFinal(data); } 私钥加密?/** * 用公钥解密 * @param data 加密数据 * @param key 密钥 * @return * @throws Exception */ publicstatic byte[] decryptByPublicKey(byte[] data,String key)throwsException{ //对私钥解密 byte[] keyBytes = decryptBASE(key); XEncodedKeySpec xEncodedKeySpec = newXEncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); Key publicKey = keyFactory.generatePublic(xEncodedKeySpec); //对数据解密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, publicKey); returncipher.doFinal(data); }

关于数字签名,先了解下何为数字签名。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与数字摘要技术的应用。简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。

数字签名的主要功能如下:

保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。

数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

数字签名是个加密的过程,数字签名验证是个解密的过程。

数字签名算法依靠公钥加密技术来实现的。在公钥加密技术里,每一个使用者有一对密钥:一把公钥和一把私钥。公钥可以自由发布,但私钥则秘密保存;还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。 普通的数字签名算法包括三种算法: 1.密码生成算法; 2.标记算法;

3.验证算法。

通过RSA加密解密算法,我们可以实现数字签名的功能。我们可以用私钥对信息生成数字签名,再用公钥来校验数字签名,当然也可以反过来公钥签名,私钥校验。

私钥签名

?/** * 用私钥对信息生成数字签名 * @param data //加密数据 * @param privateKey //私钥 * @return * @throws Exception */ publicstatic String sign(byte[] data,String privateKey)throwsException{ //解密私钥 byte[] keyBytes = decryptBASE(privateKey); //构造PKCS8EncodedKeySpec对象 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = newPKCS8EncodedKeySpec(keyBytes); //指定加密算法 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); //取私钥匙对象 PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8EncodedKeySpec); //用私钥对信息生成数字签名 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(privateKey2); signature.update(data); returnencryptBASE(signature.sign()); } 公钥校验

?/** * 校验数字签名 * @param data 加密数据 * @param publicKey 公钥 * @param sign 数字签名 * @return * @throws Exception */ publicstatic boolean verify(byte[] data,String publicKey,String sign)throwsException{ //解密公钥 byte[] keyBytes = decryptBASE(publicKey); //构造XEncodedKeySpec对象 XEncodedKeySpec xEncodedKeySpec = newXEncodedKeySpec(keyBytes); //指定加密算法 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); //取公钥匙对象 PublicKey publicKey2 = keyFactory.generatePublic(xEncodedKeySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(publicKey2); signature.update(data); //验证签名是否正常 returnsignature.verify(decryptBASE(sign)); } 对于RSA如何加密文件、图片等信息,加密的信息又如何保存,怎样保存解密后的信息,以及操作过程中遇到的错误将如何处理,将在后面的文章中介绍给大家。

定制Android ListView 快速滚动的滚动条-fast scroll bar thumb 1.方法一:privatevoidinitScrollBar(){try{Fieldf=AbsListView.class.getDeclaredField(mFastScroller);f.setAccessible(true);Objecto=f.get(mListView);f=f.getType().getDeclaredField(mThumbDrawable);f.se

查看安卓应用包名 查看安卓应用包名1)部分手机在安装应用的时候就能看到包名2)针对不能在安装时候看到包名的,只需要下载查看软件就可以看到包名。软件下载地址

Android 滚动条属性 注:转载网址

标签: rsa加解密过程是什么

本文链接地址:https://www.jiuchutong.com/biancheng/370983.html 转载请保留说明!

上一篇:Android 触摸事件传递机制(Android触摸事件回调方法)

下一篇:定制Android ListView 快速滚动的滚动条-fast scroll bar thumb(定制家具加盟品牌)

  • 国税地税合并是成功的还是失败的
  • 个人所得税退的多好还是少好
  • 公司的社保缴费基数不是工资数
  • 收到0税率发票是否可以给对方开6税率发票
  • 无法支付的应付账款转销
  • 企业应交所得税怎么算
  • 摊销土地使用权和专利权会计分录怎么写
  • 减免货款需要进项税额转出吗
  • 销售方退款回来要怎么处理?
  • 企业将自用设备进行出租
  • 企业自查补税报告怎么写?
  • 年薪制离职补偿金如何计算?
  • 发票的金额可以答应客户多开
  • 小规模纳税人需要每月清卡吗
  • 营改增后,代扣代缴所得税应当按照含税收入还是不含税收入?
  • 零售超豪华小汽车交消费税吗
  • 机打发票领回怎么录入
  • 出纳记账本如何手工记账
  • 收到承兑后背书怎么处理
  • 差额征税预缴税额怎么算
  • 在建工程如何评估价值
  • 辞退补偿入账
  • PHP:xml_set_processing_instruction_handler()的用法_XML解析器函数
  • php数字转换大写
  • wifi信号弱了
  • 自产产品用于业务招待,成本10万,售价20万
  • win10商店发生了错误请稍后再试
  • wordpress 中文版和国际版区别
  • umi ts
  • dae是什么文件
  • 员工离职当月社保怎么扣除
  • 产生永久性差异时为什么计税基础等于账面价值
  • 单位房转卖
  • 格拉纳达的阿尔罕布拉宫用什么材料制成?
  • 终身职业技能培训
  • 加计扣除减免政策
  • 被称为下一代风华的是
  • react_router
  • win11更新22468
  • 江西税务官网
  • 个税专项附加扣除金额
  • 装修公司开的劳务发票
  • 技术服务费增值税税率1%
  • 费用在发生时确认而不考虑支付费用
  • 支付股息如何做账
  • 织梦模板改成帝国模板
  • 尾款忘记支付,交易关闭怎么办
  • 印花税漏交了有什么影响
  • 报废车残值需要多少钱
  • 金税四期的政策
  • 一般纳税人简易计税方法适用情形
  • 无票收入需要缴纳文化事业建设税吗
  • 股东垫付的钱可以作为实收资本吗
  • 长期股权投资中同一控制和非同一控制的区别
  • 施工企业暂估成本
  • 利息收入红字如何入账
  • 新公司固定资产盘点总结
  • 公司注册资本减资流程
  • 长期待摊费用的二级科目有哪些
  • 筹建期间发生的所有费用
  • 房屋租赁协议印花税怎么计算
  • 去年的暂估入库今年想把它给冲出来怎么做分录
  • 固定资产折旧如何计提
  • 补缴以前年度企业年金可以税前扣除吗
  • 公司购买的办公楼怎么交房产税
  • 营改增题目
  • 学校固定资产账记法
  • win9有吗
  • 如何屏蔽网络?
  • windows2003怎么样
  • linux缺省的shell
  • ghoststarttrayapp.exe是什么进程 有什么作用 ghoststarttrayapp进程查询
  • linux系统修改
  • win7英文输入法
  • [置顶]游戏名:chivalry2
  • 手游 unity
  • js写后端用什么框架
  • 拟录用人员公示后还会递补吗
  • 中山市地方税务局官网
  • 上海市信访局官网首页
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设