這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
註:這裡的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產生的值不一樣,也能解出來。