Golang RSA演算法與 java(android)的互連

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

註:這裡的java代碼跑在android,最後的結果,本人看上去是一致的

互連要達到的要求

  • RSA加密位元:統一採用RSA 1024
  • 區塊編碼器條件:RSA/ECB/PKCS1Padding

以上條件java 與 go均要滿足,還有一點要注意,雖然java預設使用的是:RSA/ECB/PKCS1Padding。但安卓不是,所以安卓平台預設使用的RSA填充要自己指定。go 只要解密,java只要加密。私密金鑰與公開金鑰各平台只有一種。加密結果轉成base64。

java 代碼:

 /**     *利用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/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 = Base64.encodeToString(enBytes,Base64.DEFAULT);       // String encryptString = (new BASE64Encoder()).encode(enBytes);        return encryptString;    }

Go代碼:

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-----`)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)}func DeRSa(str string) (string) {    var data []byte    var err error    data, err = base64.StdEncoding.DecodeString(str)    origData, err := RsaDecrypt(data, privateKey)    if err != nil {        panic(err)    }    return string(origData)}

在如上代碼中,一定要保證公、私密金鑰相同,就算最後因為IV產生的值不一樣,也能解出來。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.