【密碼學】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==

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

明天把橢圓曲線加密寫出來


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM