如何在Go和Android之间使用RSA [英] How to use RSA between Go and Android

查看:95
本文介绍了如何在Go和Android之间使用RSA的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

I(1)在Go中创建公钥并将其发送给Android(2)android使用下面的代码加密要发送到Go的字符串类型的数据(3)获取字符串数据并尝试对其解密,但是不能.

I (1) create Public key in Go and send it for Android (2) android use below code to Encrypt it's data to send to Go with string type (3) Go get string data and try to Decrypt it, but it can't.

我的Go代码:

// DecryptWithPrivateKey decrypts data with private key
func DecryptWithPrivateKey(ciphertext []byte, priv *rsa.PrivateKey) []byte {
    plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, priv , ciphertext)
    if err != nil {
        log.Println(err)
    }
    return plaintext
}
.
.
.
so.On("serverpublic", func(msg string) {
mes := []byte(msg)
decbyte :=DecryptWithPrivateKey(data,pr)
str := fmt.Sprintf("%s", decbyte)
log.Println("encript data from Android   ---->"   , str)
})

Android Studio代码:

Android studio code:

public final static String chi="RSA/NONE/PKCS1Padding"; //RSA/ECB/PKCS1Padding

    private static byte[] dec4golang(byte[] src) throws Exception {
        Cipher cipher = Cipher.getInstance(chi);
        cipher.init(Cipher.DECRYPT_MODE, serverrk);
        return cipher.doFinal(src);
    }

    private static byte[] enc4golang(String text, PublicKey pubRSA) throws Exception{
        Cipher cipher = Cipher.getInstance(chi);
        cipher.init(Cipher.ENCRYPT_MODE, pubRSA);
        return cipher.doFinal(text.getBytes("UTF-8")); //i also advice you to use: .getBytes("UTF-8"); instead of data.getBytes();
    }

        public final static String enc4golang(String text){
        try {
            return byte2hex(enc4golang(text, serveruk)); 
//            return enc4golang(text, serveruk).toString();
//            return new String(enc4golang(text, serveruk), "UTF-8");
//            return new String(enc4golang(text, serveruk), Charset.forName("utf-8"));
//            return    Base64.encodeToString(enc4golang(text, serveruk), Base64.DEFAULT);///nodejs
//            return  Base64Utils.encodeToString(enc4golang(text, serveruk));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

     public static String byte2hex(byte[] b)
    {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n ++)
        {
            stmp = Integer.toHexString(b[n] & 0xFF);
            if (stmp.length() == 1)
                hs += ("0" + stmp);
            else
                hs += stmp;
        }
        return hs.toUpperCase();
    }

我认为我的问题出在以下几行:

I think my problem is in these lines:

chi ="RSA/NONE/PKCS1Padding";//RSA/ECB/PKCS1Padding

chi="RSA/NONE/PKCS1Padding"; //RSA/ECB/PKCS1Padding

OR

返回byte2hex(enc4golang(text,serveruk));

return byte2hex(enc4golang(text, serveruk));

推荐答案

我已经对其进行了测试并且有效.

I have tested it and it worked.

在Go中,我使用以下功能:

in Go i use this fnction:

func rusdec(encryptedString string , privateKey string) (string, error) {
     base64DecodeBytes, err := base64.StdEncoding.DecodeString(encryptedString)
     if err != nil {
         return "", err
     }
     privateKeyBlock, _ := pem.Decode([]byte(privateKey))
     var pri *rsa.PrivateKey
     pri, parseErr := x509.ParsePKCS1PrivateKey(privateKeyBlock.Bytes)
     if parseErr != nil {
         return "", parseErr
     }
     decryptedData, decryptErr := rsa.DecryptOAEP(sha1.New(), rand.Reader, pri, base64DecodeBytes, nil)
     if decryptErr != nil {
         return "", decryptErr
     }
     return string(decryptedData), nil
}

以及在Android Studio中:

and in Android studio :

public final static String chi ="RSA/ECB/OAEPPadding";

public final static String chi="RSA/ECB/OAEPPadding";

公共最终静态字符串RSA ="RSA";

public final static String RSA = "RSA";

private最终静态int CRYPTO_BITS = 512;

private final static int CRYPTO_BITS = 512;

public static PublicKey stringToPublicKeytoserver(String publicKeyString)
    {
        try {
            if (publicKeyString.contains("-----BEGIN PUBLIC KEY-----") || publicKeyString.contains("-----END PUBLIC KEY-----"))
                publicKeyString = publicKeyString.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
            publicKeyString = publicKeyString.replace("-----BEGIN PUBLIC KEY-----", "");
            publicKeyString = publicKeyString.replace("-----END PUBLIC KEY-----", "");
            byte[] keyBytes = Base64.decode(publicKeyString, Base64.DEFAULT);
            X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(RSA);
            serveruk=keyFactory.generatePublic(spec);
            return serveruk;
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
            return null;
        }
    }

    
     private static byte[] enc4golang(String text, PublicKey pubRSA) throws Exception{
        Cipher cipher = Cipher.getInstance(chi);
        cipher.init(Cipher.ENCRYPT_MODE, pubRSA);
        return cipher.doFinal(text.getBytes("UTF-8")); //i also advice you to use: .getBytes("UTF-8"); instead of data.getBytes();
    }
    
    
    public final static String enc4golang(String text){
        try {
            return Base64.encodeToString(enc4golang(text, serveruk) ,Base64.DEFAULT);  //send this string to golang
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

Go的公钥和私钥:

 const priPEM = `-----BEGIN RSA PRIVATE KEY-----
    MIIBOQIBAAJBALEZ+CmY7YN7KWib5Oh0AuWqfHiq3aURV1WGaaBm+X43kF3RRGJd
    HbVdOEb2+YoNyni+LD5CQ4R3T7/f0sePzv0CAwEAAQJAc0MAlSoXotPcjl2vrG4c
    mJbNrcceu9i+a0Ywppl+VVsEPOnapMQsVM04BpJzFmi00S+Sxl0pO1oAX0pwX7Oq
    4QIhAOcncV+SQYlOWoH/phOGkA3y5j0eO2uUfqrXJX0q6/+FAiEAxCMvlkSePzkn
    EROwzJu8tpZrIB6CNZ5KKfhPW7Dj3xkCIEvW1w2iMLpZ6LwKInT5iz3oWb3ns1si
    h0SJ/hTJBlD5AiAKEtyQ1TljeeX9xIsiFyWcIyGhZq+9XUHl4fEBfpZVkQIgMfrj
    qLoCdQH1D5F69WUMYd0n36Xpmqf7L9yV0Ofkz1Y=
    -----END RSA PRIVATE KEY-----`

  const pubPEM = `-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALEZ+CmY7YN7KWib5Oh0AuWqfHiq3aUR
V1WGaaBm+X43kF3RRGJdHbVdOEb2+YoNyni+LD5CQ4R3T7/f0sePzv0CAwEAAQ==
-----END PUBLIC KEY-----`

这篇关于如何在Go和Android之间使用RSA的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆