密码学RSA加密 kotlin实现方法(支持任意字节长度)
Posted robotpaul
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了密码学RSA加密 kotlin实现方法(支持任意字节长度)相关的知识,希望对你有一定的参考价值。
这个编辑器不支持kotlin,尴尬了····
算了,就用Java来弄吧
val 定义常量
var 定义变量
具体kotlin的开发手册详见:http://www.runoob.com/kotlin/kotlin-tutorial.html
真的不想用Miracl这个库···而且只支持c
但是用kotlin(其实是java中自带的security库)真的超级方便!!!!
看代码就知道了:(如果要是c++我得写多少啊···/笑哭)
(代码高亮不符合,请以IDEA为准)
import com.sun.org.apache.xml.internal.security.utils.Base64.encode import java.io.ByteArrayOutputStream import java.security.KeyPairGenerator import java.security.PrivateKey import java.security.PublicKey import javax.crypto.Cipher /* RSA的加密解密实现 2018.12.4 */ object RSA加密{ /* 私钥加密 Input是原文 publicKey是私钥 */ val ENCRYPT_MAX_SIZE=117 fun encryptByPubicKey(input:String, publicKey: PublicKey):String { var byteArray=input.toByteArray() //把Input内容取出来 var temp:ByteArray?=null var offset:Int=0 //当前偏移位置 //1.创建cipher对象 val cipher=Cipher.getInstance("RSA")//选择RSA加密解密 //2.初始化cipher cipher.init(Cipher.ENCRYPT_MODE,publicKey)//加密模式 //加密 分段进行 var os=ByteArrayOutputStream() while(byteArray.size-offset>0) { //每次加密最大117字节 if(byteArray.size-offset>= ENCRYPT_MAX_SIZE)//剩余部分大于最大加密长度则进行完整一次加密操作 { temp= cipher.doFinal(byteArray,offset, ENCRYPT_MAX_SIZE) //重新计算偏移的位置 offset+= ENCRYPT_MAX_SIZE } else { temp= cipher.doFinal(byteArray,offset, byteArray.size-offset) offset=byteArray.size } //存储到临时缓冲区 //加密最后一块剩下来的 os.write(temp) } os.close() return com.sun.org.apache.xml.internal.security.utils.Base64.encode(os.toByteArray()) } } fun main(args: Array<String>) { //如何生成密钥对 val input="突然想坐火车了,一定要靠在窗边,这样便可以避开旁人奇怪的东张西望的眼神,一定要带上耳机,这样就听不到车厢里琐碎的声音。我知道火车要开向何方,也知道何时到达,很重要很幸福的一件事就是,在到达之前的那段时间我是自由的。尽管车厢里没有风,但看着窗外的我似乎触到了外面田野上的清风。" val generator=KeyPairGenerator.getInstance("RSA") //密钥对生成器 val keyPair=generator.genKeyPair() //生成密钥对 val publicKey=keyPair.public //生成公钥 val privateKey=keyPair.private //生成私钥 //println("公钥:"+encode(publicKey.encoded)) //println("私钥:"+ encode(privateKey.encoded)) /*********************非对称加密三部曲****************************/ //1.创建cipher对象 //val cipher=Cipher.getInstance("RSA")//选择RSA加密解密 //2.初始化cipher //val key: Key?=null //创建密钥 //cipher.init(Cipher.ENCRYPT_MODE,key)//加密模式 //加密/解密 println("原文:"+input) println("RSA公钥加密后:"+RSA加密.encryptByPubicKey(input,publicKey)) }
执行结果:
这里用了BASE64编码,要不然全是乱码哈哈哈
原文:突然想坐火车了,一定要靠在窗边,这样便可以避开旁人奇怪的东张西望的眼神,一定要带上耳机,这样就听不到车厢里琐碎的声音。
我知道火车要开向何方,也知道何时到达,很重要很幸福的一件事就是,在到达之前的那段时间我是自由的。
尽管车厢里没有风,但看着窗外的我似乎触到了外面田野上的清风。
RSA公钥加密后:
C4Q6gJRidH3dwAsNA9vCeH7uqKfd3k05fHbGT4To0Uyyvdm2MYImcyueAwAqDd4aKpVRa+tfrIcA P3lCmT8h1zscSbJzWML3zqBkq1VcCSKtcv/Vb/pgFR5AYAgo9tA/eoqn2mJi/gHPu4WGDHiiljI8 eH1Tj7wdfT0LNlmUfqTpNjHfer/Ebxr62VKQOQrLhHrI9iwYu7427YSidRwcx8+cuOTaQZrZzs6W BR2G1kK6XlaGdeB/tfMUvu9l2COQ3DfamgbiiqulKwmpkdDfpvhycVdKTjLuo29hezeAx05MmkT3 iyjiOBk6S5KWq8HgNludlqRC9iuCM7R5m1xca2MhjRUUMUVQAchxiBu3GXrEOoJJZq2bpo4v1XOk q9a8+IlRgCcEIP9fBd8f5dCqF//QI5/u0Np9TL4qX5TOgXOHX8f4iL9PRY13hUQ9I8mcHM/BewHu S5oR4nijxYKlkANYWzWXshTU8wLyOIRpIc25gSHzt0iDwf6/bCXIJr1YdFQXodyBelRVcNwqWsZk oi267JZvop+Mmm7fOuAJMzrxsRDM0jYPvIhcPc9E7DWXQeY9fCTXVNQgLIjPh0gHHqRwQjvS+AQ0 0FagVwxTBKlXYmvnAEetuXgpJv9Q+9R8QXsKbLAv+TSZvKNkh69WGbb4RW4UclsJiMHrvAJR2+lh nCdsCJGSfcfXmKoK5ZDZTdNoZM4E8mxcOownPwsPJUWiX9JR3iNL0tzm137yqnA1dZPwEiUKwX9S XB3ODSrAjV/ARHdRF/jgAQbN8VUdUg4OPPleoOvFR9D2fIBZrVOsBirkcBrawCsZUbFc/Oh3OONR SXHJhgWo2AeM1CQqUBqZyMfCLKZXfu8bmlbhwJfr+Nsx0ChNF8KmTCtvehejiMrAgu9HMFUf7DYT LV5JVJptUq4qEfj94JSNufIRWi2yEBwfgV1HV1eWIrBJXkl9l8bKviIjdmKtLaxmQLVO3EXBuncl Fgcv2CcoB4SXmSfbwHSM0wgwCpR8WG9dF5uKcEHIHkqnJiogT6ikr4y2tSadNJ9BKPuanlqtRvVw fDxySWY57OoMrtqGDBM+nex1JkAdKo3Z7a7ALOZp/7AohH0B7nP/sE68upNFYO2wQNIMy/KBcxb5 VXyb5VK+dhlgSL2YMlLeOy06dPf5tClhoZijPgfw4svyOc9kIW8763tPHQsZMw21agg1jAtbvRml m+nh5n0modCrdghguIkxCXW0dmrW0WnrXK67q2sKU+UUqkoo32Vyz9gdj8YwN+sisYzsEamIwUt6 L3XwjB7LgHa97dMhVBJMuNwogn/fy9HY4ZQf1xX2XVDloL98LXdsXRo/ZYHzaVRUuF4+RV2pwg==
(什么鬼玩意···加密真可怕)
明天把椭圆曲线加密写出来
以上是关于密码学RSA加密 kotlin实现方法(支持任意字节长度)的主要内容,如果未能解决你的问题,请参考以下文章