密码学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实现方法(支持任意字节长度)的主要内容,如果未能解决你的问题,请参考以下文章

公钥密码系统及RSA公钥算法

密码学第四讲-对称加密算法AES原理及实现

用RSA加密实现Web登录密码加密传输

RSA 加密及php实现

RSA 加密及php实现

非对称加密原理和实现——RSA