1. 程式人生 > >【密碼學】RSA加密 kotlin實現方法(支援任意位元組長度)

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

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

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