JAVA與GO語言實現的RSA密碼編譯演算法的互連

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

之前寫過C#與JAVA語言RSA演算法的互連程式,後來又找了找JAVA與GO語言互連的RSA演算法,發現沒有現成的,經過探索後,成功實現了兩者的互連,現在分享如下:

注意:1 .兩者的公開金鑰和私密金鑰是不能混用的,即JAVA的公私密金鑰是不能直接用於GO的,反過來也不行。

    2.下面的JAVA源碼的解密思想是:

(1)將java產生的公開金鑰pubKey_from_java複製給Go

(2)Go利用java的公開金鑰加密一段資訊,data,err=RsaEncrypt(" hello ",pubKey_from_java)

(3)java利用自己的私密金鑰privKey_from_java解密這段資訊data,已驗證通過。

   3. Go源碼解密的思想與上述同理,不再贅述。直接上原始碼。


JAVA實現RSA的源碼如下:


package rsa;import java.security.Key;  import java.security.KeyFactory;  import java.security.KeyPair;  import java.security.KeyPairGenerator;  import java.security.PrivateKey;  import java.security.PublicKey;  import java.security.interfaces.RSAPrivateKey;  import java.security.interfaces.RSAPublicKey;  import java.security.spec.PKCS8EncodedKeySpec;  import java.security.spec.X509EncodedKeySpec;     import javax.crypto.Cipher;     import sun.misc.BASE64Decoder;  import sun.misc.BASE64Encoder;  public class RSAHelper {/** *私人資料成員,主要是公開金鑰和私密金鑰  *由程式自己產生,公開金鑰需傳遞給通訊另一方 */private static String publicKey;private static String privateKey;/** * 產生公開金鑰和私密金鑰 */private static void genKeys() throws Exception{ KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");           //密鑰位元           keyPairGen.initialize(1024);           //金鑰組           KeyPair keyPair = keyPairGen.generateKeyPair();           // 公開金鑰           PublicKey pubKey = (RSAPublicKey) keyPair.getPublic();           // 私密金鑰           PrivateKey privKey = (RSAPrivateKey) keyPair.getPrivate();           publicKey= getKeyString(pubKey);           privateKey= getKeyString(privKey);  }/** *擷取程式自動產生的公開金鑰  * @return 返回公開金鑰 */public static String getPubKey(){return publicKey;}/** *擷取程式自動產生的私密金鑰  * @return 返回私密金鑰 */public static String getPrivKey(){return privateKey;}    /**      * 得到公開金鑰      * @param key 密鑰字串(經過base64編碼)      * @throws Exception      */      public static PublicKey getPublicKey(String key) throws Exception {            byte[] keyBytes;            keyBytes = (new BASE64Decoder()).decodeBuffer(key);             X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);            KeyFactory keyFactory = KeyFactory.getInstance("RSA");            PublicKey publicKey = keyFactory.generatePublic(keySpec);            return publicKey;      }      /**      * 得到私密金鑰      * @param key 密鑰字串(經過base64編碼)      * @throws Exception      */      public static PrivateKey getPrivateKey(String key) throws Exception {            byte[] keyBytes;            keyBytes = (new BASE64Decoder()).decodeBuffer(key);            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);            KeyFactory keyFactory = KeyFactory.getInstance("RSA");            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);            return privateKey;      }       /**      * 得到密鑰字串(經過base64編碼)      * @return      */      public static String getKeyString(Key key) throws Exception {            byte[] keyBytes = key.getEncoded();            String s = (new BASE64Encoder()).encode(keyBytes);            return s;      }     /**    *利用Go語言產生的公開金鑰加密     * @param pubkey_from_go 從伺服器(go語言實現)擷取的公開金鑰    * @param plainText 需要加密的字串    */    public static String encByGoPubKey(String pubkey_from_go,String plainText) throws Exception {    //加解密類          Cipher cipher = Cipher.getInstance("RSA");//Cipher.getInstance("RSA/ECB/PKCS1Padding");          byte[] plainTextBytes = plainText.getBytes();          //用Go語言產生的公開金鑰加密          PublicKey pubkey_go=getPublicKey(pubkey_from_go);        cipher.init(Cipher.ENCRYPT_MODE, pubkey_go);          byte[] enBytes = cipher.doFinal(plainTextBytes);          String encryptString = (new BASE64Encoder()).encode(enBytes);          return encryptString;         }    /**     *用私密金鑰解密Go語言用java公開金鑰產生的密文      *      */    public static String decryptByJavaPrivKey(String privkey_from_java,String encryptedString) throws Exception{       //加解密類         Cipher cipher = Cipher.getInstance("RSA");//Cipher.getInstance("RSA/ECB/PKCS1Padding");         // G0語言通過java產生的公開金鑰加密得到的加密後的字串       byte[] enBytes=(new BASE64Decoder()).decodeBuffer(encryptedString);       //通過密鑰字串得到密鑰             PrivateKey  privateKey = getPrivateKey(privkey_from_java);         //解密         cipher.init(Cipher.DECRYPT_MODE, privateKey);         byte[]deBytes = cipher.doFinal(enBytes);        String decryptString=new String(deBytes);       return decryptString;        }        public static void main(String[] args) throws Exception {             genKeys();              String publicKeyString =getPubKey();            System.out.println("public key:\n" + publicKeyString);           String privateKeyString = getPrivKey();            System.out.println("private key:\n" + privateKeyString);            //java產生的公開金鑰和私密金鑰          String pubKey_from_java="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmb2bXhcfeiosnxs0bD17isalelyS2/0xKQdJU"+           "VUyMdt+/5Inm/S5upDFrliMs3i9zj3PtJWO7yzRfiBnoDNlOfTqPNY6DI9FXnhDgjQMJhp1Zbhl7"+           "d74E63CBVTU6Deocqfy/KCiPjQnpTzln89Mm7eE3WbvlmvX3mO7uD2/geQIDAQAB";          String privKey_from_java="MIIBNwIBADANBgkqhkiG9w0BAQEFAASCASEwggEdAgEAAoGBAOZvZteFx96KiyfGz"+          "RsPXuKxqV6XJLb/TEpB0lRVTIx237/kieb9Lm6kMWuWIyzeL3OPc+0lY7vLNF+IGe"+          "gM2U59Oo81joMj0VeeEOCNAwmGnVluGXt3vgTrcIFVNToN6hyp/L8oKI+NCelPOWf"+          "z0ybt4TdZu+Wa9feY7u4Pb+B5AgEAAoGBAL5mmBxGzwIDib2hF0JfrfA0ChU9X7nR"+          "MrE8t9S08l4xrul4pbV1x1LmWmtiD8h4Ac9DXe858LFv0uOIqpdBXp9ZMyoqBC97L"+          "wDboutzt6OcXQ3hMVTOszn9cFFIf6JXaLz8HgocqAHTLVM4LwmyZNbGAyX/vja9BX"+          "jVtUQdVxt9AgEAAgEAAgEAAgEAAgEA";          //Go產生的公開金鑰和私密金鑰          String pubKey_from_go="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZsfv1qscqYdy4vY+P4e3cAtmv"+          "ppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0Dgacd"+          "wYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NL"+          "AUeJ6PeW+DAkmJWF6QIDAQAB";          String privKey_from_go="MIICXQIBAAKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y"+          "7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7"+          "Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQAB"+          "AoGBAJlNxenTQj6OfCl9FMR2jlMJjtMrtQT9InQEE7m3m7bLHeC+MCJOhmNVBjaM"+          "ZpthDORdxIZ6oCuOf6Z2+Dl35lntGFh5J7S34UP2BWzF1IyyQfySCNexGNHKT1G1"+          "XKQtHmtc2gWWthEg+S6ciIyw2IGrrP2Rke81vYHExPrexf0hAkEA9Izb0MiYsMCB"+          "/jemLJB0Lb3Y/B8xjGjQFFBQT7bmwBVjvZWZVpnMnXi9sWGdgUpxsCuAIROXjZ40"+          "IRZ2C9EouwJBAOPjPvV8Sgw4vaseOqlJvSq/C/pIFx6RVznDGlc8bRg7SgTPpjHG"+          "4G+M3mVgpCX1a/EU1mB+fhiJ2LAZ/pTtY6sCQGaW9NwIWu3DRIVGCSMm0mYh/3X9"+          "DAcwLSJoctiODQ1Fq9rreDE5QfpJnaJdJfsIJNtX1F+L3YceeBXtW0Ynz2MCQBI8"+          "9KP274Is5FkWkUFNKnuKUK4WKOuEXEO+LpR+vIhs7k6WQ8nGDd4/mujoJBr5mkrw"+          "DPwqA3N5TMNDQVGv8gMCQQCaKGJgWYgvo3/milFfImbp+m7/Y3vCptarldXrYQWO"+          "AQjxwc71ZGBFDITYvdgJM1MTqc8xQek1FXn1vfpy2c6O";                 //用Go語言產生的公開金鑰加密            String plainText = "Hello,I am  plaintext string!@sina.com";            String encryptString=encByGoPubKey(pubKey_from_go,plainText);          System.out.println("加密後的字串:\n"+encryptString);                     //解密G0語言通過java公開金鑰加密得到的字串          String enString_from_go="jIYRVYv3kDiSXN6fWMuZdJj/ljLUv51TtNbbZi1m8h2jc/UzYxVnuYUp66kd8dEeROQ0gAqwXdovBFauzoDfPUtCBWZ0OJZrnyOC1jlE0/FRTIq+goA7B97k2WdYueEtkydNsahNzsABO+mA/hZE+P+oiZojoZISpAVyWyVD7XA=";          String decryptString=decryptByJavaPrivKey(privKey_from_java,enString_from_go);          System.out.println("解密後的字串:\n"+decryptString);        }   }
說明:

1. 上述java代碼的注釋已經比較完善,寫過加密的童鞋應該都能看懂。其中引入的兩個包:

import sun.misc.BASE64Decoder;  import sun.misc.BASE64Encoder; 
Eclipse預設情況下是不支援的Base64編碼的,設定方法:

右鍵項目->屬性->java build path->Libraries->jre SystemLibrary->Access rules,在出現的對話方塊中,第一行Resolution選擇accessiable,第二行填上:** 即可 (兩個星號)。


接下來是GO語言的原始碼

package mainimport (    "crypto/rand"    "crypto/rsa"    "crypto/x509"    "encoding/base64"    "encoding/pem"    "errors"    "flag"    "fmt")var decrypted stringfunc init() {    flag.StringVar(&decrypted, "d", "", "加密過的資料")    flag.Parse()}func main() {    var data []byte    var err error    if decrypted != "" {        data, err = base64.StdEncoding.DecodeString(decrypted)        if err != nil {            panic(err)        }    } else {        //利用用戶端傳來的公開金鑰加密有效資訊        data, err = RsaEncrypt([]byte("polaris@studygolang.com"), publicKey_by_java)        if err != nil {            panic(err)        }        fmt.Println("rsa encrypt(base64): \n" + base64.StdEncoding.EncodeToString(data))    }    data, err = base64.StdEncoding.DecodeString("W/lT8KrQLB7Pj3sXI0sAwCyFjvCnVr/tUlgYHqUx3L8dZ5+sYMJqtatsas3Ks5qVmdMFBIKg4tZiA0WsqOQgt36z/xudRBvHxLIFSowpO4xjcym4vBaWnUiYEzJDed7jbSwaPHQTSLinqclSxbh32TKTJ9dFmihD2/vp0bfyt/k=")    origData, err := RsaDecrypt(data, privateKey)    if err != nil {        panic(err)    }    fmt.Println("rsa decrypt(base64):\n" + string(origData))}// 公開金鑰和私密金鑰可以從檔案中讀取var privateKey = []byte(`-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQABAoGBAJlNxenTQj6OfCl9FMR2jlMJjtMrtQT9InQEE7m3m7bLHeC+MCJOhmNVBjaMZpthDORdxIZ6oCuOf6Z2+Dl35lntGFh5J7S34UP2BWzF1IyyQfySCNexGNHKT1G1XKQtHmtc2gWWthEg+S6ciIyw2IGrrP2Rke81vYHExPrexf0hAkEA9Izb0MiYsMCB/jemLJB0Lb3Y/B8xjGjQFFBQT7bmwBVjvZWZVpnMnXi9sWGdgUpxsCuAIROXjZ40IRZ2C9EouwJBAOPjPvV8Sgw4vaseOqlJvSq/C/pIFx6RVznDGlc8bRg7SgTPpjHG4G+M3mVgpCX1a/EU1mB+fhiJ2LAZ/pTtY6sCQGaW9NwIWu3DRIVGCSMm0mYh/3X9DAcwLSJoctiODQ1Fq9rreDE5QfpJnaJdJfsIJNtX1F+L3YceeBXtW0Ynz2MCQBI89KP274Is5FkWkUFNKnuKUK4WKOuEXEO+LpR+vIhs7k6WQ8nGDd4/mujoJBr5mkrwDPwqA3N5TMNDQVGv8gMCQQCaKGJgWYgvo3/milFfImbp+m7/Y3vCptarldXrYQWOAQjxwc71ZGBFDITYvdgJM1MTqc8xQek1FXn1vfpy2c6O-----END RSA PRIVATE KEY-----`)/**/var privateKey_by_java = []byte(`-----BEGIN RSA PRIVATE KEY-----MIIBNwIBADANBgkqhkiG9w0BAQEFAASCASEwggEdAgEAAoGBAOZvZteFx96KiyfGzRsPXuKxqV6XJLb/TEpB0lRVTIx237/kieb9Lm6kMWuWIyzeL3OPc+0lY7vLNF+IGegM2U59Oo81joMj0VeeEOCNAwmGnVluGXt3vgTrcIFVNToN6hyp/L8oKI+NCelPOWfz0ybt4TdZu+Wa9feY7u4Pb+B5AgEAAoGBAL5mmBxGzwIDib2hF0JfrfA0ChU9X7nRMrE8t9S08l4xrul4pbV1x1LmWmtiD8h4Ac9DXe858LFv0uOIqpdBXp9ZMyoqBC97LwDboutzt6OcXQ3hMVTOszn9cFFIf6JXaLz8HgocqAHTLVM4LwmyZNbGAyX/vja9BXjVtUQdVxt9AgEAAgEAAgEAAgEAAgEA-----END RSA PRIVATE KEY-----`)var publicKey = []byte(`-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQAB-----END PUBLIC KEY-----`)var publicKey_by_java = []byte(`-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmb2bXhcfeiosnxs0bD17isalelyS2/0xKQdJUVUyMdt+/5Inm/S5upDFrliMs3i9zj3PtJWO7yzRfiBnoDNlOfTqPNY6DI9FXnhDgjQMJhp1Zbhl7d74E63CBVTU6Deocqfy/KCiPjQnpTzln89Mm7eE3WbvlmvX3mO7uD2/geQIDAQAB-----END PUBLIC KEY-----`)//利用用戶端傳來的公開金鑰(java語言產生)加密func RsaEncrypt(origData []byte, pubKey []byte) ([]byte, error) {    block, _ := pem.Decode(pubKey)    if block == nil {        return nil, errors.New("public key error")    }    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)    if err != nil {        return nil, err    }    pub := pubInterface.(*rsa.PublicKey)    return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)}// 解密由用戶端(java)利用伺服器(Go語言實現,即本程式)公開金鑰加密的資訊func RsaDecrypt(ciphertext []byte, privKey []byte) ([]byte, error) {    block, _ := pem.Decode(privKey)    if block == nil {        return nil, errors.New("private key error!")    }    priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)    if err != nil {        return nil, err    }    return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)}

說明:更多關於Go語言的RSA密碼編譯演算法的解析請參考:http://blog.studygolang.com/?p=137


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.