亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在android和go之間使用RSA

在android和go之間使用RSA

Go
牧羊人nacy 2023-07-31 10:57:29
在一個用go和android的聊天項目中,我想使用RSA進行加密我如何在 go 中創建私鑰和公鑰以發送到 android ?我嘗試了很多方法,但在 android 中當我想解析公鑰 Android 時給出錯誤? public static PublicKey stringToPublicKeytoserver(String publicKeyString)? ? {? ? ? ? try {? ? ? ? ? ? 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;? ? ? ? }? ? }安卓錯誤java.security.spec.InvalidKeySpecException:com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException:解析公鑰時出錯密鑰生成? ?// Generate RSA Keys? ?miryanPrivateKey, err := rsa.GenerateKey(rand.Reader, 1024)? ?fatal(err)? ?// save PEM file? ?pemfile, err := os.Create("public.pem")? ?if err != nil {? ? ? ?fmt.Println(err)? ? ? ?os.Exit(1)? ?}? ?//publi := &miryanPrivateKey.PublicKey? ?// http://golang.org/pkg/encoding/pem/#Block? ?var pemkey = &pem.Block{? ? ? ?Type : "PUBLIC KEY",? ? ? ?Bytes : x509.MarshalPKCS1PublicKey(&miryanPrivateKey.PublicKey)}? ?err = pem.Encode(pemfile, pemkey)? ?if err != nil {? ? ? ?fmt.Println(err)? ? ? ?os.Exit(1)? ?}? ?pemfile.Close()? ?//and even i use function to convert toPKCS8? ?byt, _:= MarshalPKCS8PublicKey(&miryanPrivateKey.PublicKey)? ?var pemkey = &pem.Block{? ? ? ?Type : "PUBLIC KEY",? ? ? ?Bytes : byt}}我認為我的主要問題是,去使用 pkcs1 但 android 使用 pkcs8
查看完整描述

1 回答

?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

我修復它 !


我使用以下 Go 代碼生成公鑰和私鑰:


/*

 * Genarate rsa keys.

*/


package main


import (

    "crypto/rand"

    "crypto/rsa"

    "crypto/x509"

    "encoding/gob"

    "encoding/pem"

    "fmt"

    "os"

)


func main() {

    reader := rand.Reader

    bitSize := 2048


    key, err := rsa.GenerateKey(reader, bitSize)

    checkError(err)


    publicKey := key.PublicKey


    saveGobKey("private.key", key)

    savePEMKey("private.pem", key)


    saveGobKey("public.key", publicKey)

    savePublicPEMKey("public.pem", publicKey)

}


func saveGobKey(fileName string, key interface{}) {

    outFile, err := os.Create(fileName)

    checkError(err)

    defer outFile.Close()


    encoder := gob.NewEncoder(outFile)

    err = encoder.Encode(key)

    checkError(err)

}


func savePEMKey(fileName string, key *rsa.PrivateKey) {

    outFile, err := os.Create(fileName)

    checkError(err)

    defer outFile.Close()


    var privateKey = &pem.Block{

        Type:  "PRIVATE KEY",

        Bytes: x509.MarshalPKCS1PrivateKey(key),

    }


    err = pem.Encode(outFile, privateKey)

    checkError(err)

}


func savePublicPEMKey(fileName string, pubkey rsa.PublicKey) {

    asn1Bytes, err := x509.MarshalPKIXPublicKey(&pubkey)

    checkError(err)


    var pemkey = &pem.Block{

        Type:  "PUBLIC KEY",

        Bytes: asn1Bytes,

    }


    pemfile, err := os.Create(fileName)

    checkError(err)

    defer pemfile.Close()


    err = pem.Encode(pemfile, pemkey)

    checkError(err)

}


func checkError(err error) {

    if err != nil {

        fmt.Println("Fatal error ", err.Error())

        os.Exit(1)

    }

}

然后我用 GO 中生成的公鑰在 android 中加密我的消息:


static PublicKey serveruk;



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


public final static String RSA = "RSA";


private final static int CRYPTO_BITS = 512;



String pubPEM = "public key from public.pem";


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);


    stringToPublicKeytoserver(pubPEM);

    Log.e("ENCODED", enc4golang("Please hide me !"));


}



public static PublicKey stringToPublicKeytoserver(String publicKeyString)

{

    try {

        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 代碼解密它:


package main


import (

    "crypto/rand"

    "crypto/rsa"

    "crypto/sha1"

    "crypto/x509"

    "encoding/base64"

    "encoding/pem"

)


func main(){


    const priPEM = `private key from private.pem`


    const pubPEM = `public key from public.pem`


    base64DecodeBytes, err := base64.StdEncoding.DecodeString("encrypted data from android")

    if err != nil {

        panic(err)

    }

    privateKeyBlock, _ := pem.Decode([]byte(priPEM))

    var pri *rsa.PrivateKey

    pri, parseErr := x509.ParsePKCS1PrivateKey(privateKeyBlock.Bytes)

    if parseErr != nil {

        panic(parseErr)

    }

    decryptedData, decryptErr := rsa.DecryptOAEP(sha1.New(), rand.Reader, pri, base64DecodeBytes, nil)

    if decryptErr != nil {

        panic(decryptErr)

    }


    print(string(decryptedData))


}


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號