In a chat project with go and android, I want to use RSA for encryption
I found solution in this question, and work find, but i need to change private and public key for each user !
How can i create private and public key in go for sending to android ?
I try many ways but in android give error when i want parse public key 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;
}
}
Android Error
java.security.spec.InvalidKeySpecException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: Error parsing public key
Key Generation
// 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}
func MarshalPKCS8PublicKey(key *rsa.PublicKey) ([]byte, error) {
var pkey PKCS8Key
pkey.Version = 0
pkey.PrivateKeyAlgorithm = make([]asn1.ObjectIdentifier, 1)
pkey.PrivateKeyAlgorithm[0] = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}
pkey.PrivateKey = x509.MarshalPKCS1PublicKey(key)
return asn1.Marshal(pkey)
}
i think my main problem is, go use pkcs1 but android use pkcs8
public.pem
-----BEGIN PUBLIC KEY-----
MIGfAgEAMAsGCSqGSIb3DQEBAQSBjDCBiQKBgQDh1jHGdbo/QLeA1y5lC2YSSoal
hPBLWxz7OYpNj5pZDcuqrJFfhEvv1CGvBR0bKB/3hTpUYAPiswI+OH2BcHks0+Ef
N/KZYjPQQsB1gJByENTPvdQwlDIJVW8cDhij7jMMwq/TOs+ijudCUojcfvkJ5Zvf
BJB6g0ucg580W98K4wIDAQAB
-----END PUBLIC KEY-----