zoukankan      html  css  js  c++  java
  • 【密码学】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==

     (什么鬼玩意···加密真可怕)

    明天把椭圆曲线加密写出来

  • 相关阅读:
    React 不暴露webpack配置的情况下,修改webpack配置
    Array的一些方法
    ES 6 学习
    位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题
    句子反转——牛客刷题(java)
    数串——牛客刷题
    链表分割——牛客剑指offer
    合并两个排序链表——牛客offer
    复杂链表的复制——牛客offer
    两个链表的第一个公共结点——牛客offer
  • 原文地址:https://www.cnblogs.com/robotpaul/p/10068348.html
Copyright © 2011-2022 走看看