RSA (Rivest–Shamir–Adleman) is one of the first public-key cryptosystems and is widely used for secure data transmission. In such a cryptosystem, the encryption key is public and it is different from the decryption key which is kept secret (private). In RSA, this asymmetry is based on the practical difficulty of the factorization of the product of two large prime numbers, the "factoring problem". The acronym RSA is made of the initial letters of the surnames of Ron Rivest, Adi Shamir, and Leonard Adleman, who first publicly described the algorithm in 1978. Clifford Cocks, an English mathematician working for the British intelligence agency Government Communications Headquarters (GCHQ), had developed an equivalent system in 1973, but this was not declassified until 1997.

Public key cryptography uses a pair of keys for encryption. Distribute the public key to whoever needs it but safely secure the private key.

Public key cryptography can be used in two modes:

  • Encryption: Only the private key can decrypt the data encrypted with the public key.
  • Authentication: Data encrypted with the private key can only be decrypted with the public key thus proving who the data came from.

1 KeyPair

A key Pair is a pair of a public and a private key. Next you can see how to generate a Key Pair and to extract public and private keys in PEM format:

Copy
<script>
    var kp = new Ax.crypt.KeyPair("RSA", 2048);

    var rsa = new Ax.crypt.RSA(kp);

    console.log("PrivateKey :" + kp.getPrivateKey());
    console.log("PrivateKey :" + kp.getPrivateKeyAsPEM());
    console.log(" PublicKey :" + kp.getPublicKey());
    console.log(" PublicKey :" + kp.getPublicKeyAsPEM());


    var pub_pem  = rsa.toPublicKey();
    var pri_pem  = rsa.toPrivateKey();
    console.log(pub_pem);
    console.log(pri_pem);
</script>
PrivateKey :[B@2a3d1f93
PrivateKey :-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCKWec4+S/qXnhLPqk3Fv10dMfn
EgvNcQDaw3giXM8VmBwPMFwSmphwMimGtWzTfYhdpCVrRDIRxHNl55stS6D8YyhgKHl+UC48ZRO2
8Y50wyOvnHOyFXkMAYmchcC97ArhE6gQZRXk2tBlFGjb805IR10TvLdA3LqkGpFe0ZpZc3iM6RSl
QwFGCJqp9WbokEHbDF3asUzOVBIZ3peNYVTzrCe6wBMux8vHWRewkUDdmgmUWnf7u5Cb+j0SQgIp
eTeo94VukVfB9jNyKn0RhS6VBwpEixy8krMN98EOjG5dMzf5XNLaGSLuHYdmsc/8dTUuehV68TlP
Gtu7NRo52YPNAgMBAAECggEAEG6tL+8o6cVetFE09/4bDIHyXFegXz5Uw6cD1dEAJ6hxbLxpsyv5
fxn2JLHXwybd04FzkFIBQGr86dWgcLjS3idI3GLySzZqx3GZ7diy+ttSmcETXMuAHRTxq02Xnvcy
M5mKFKhs+UmkBt1ttvInEh6nx3haq7GL2YHuUjzDAGyx5fYfRxzzFWGJl3iXGSYf2xe1GZEaot4F
48Y7CKGL9vLk+qHEcjQRNs6ov/LOkXHVef2AV0KWkDz2YyBVIsnEQrOjtska7AkmZMb1b53PU2ex
GCGJrK9HupAbUTzAVxja+AMhnve8GK2X6AzHhHHY32W27NtjiNh9kYudkRwkYQKBgQC/3aJ+jxi6
kCE4XfDVS+hCeziRHyLYiA4y0dLwlIwr1tB3ecGwtZOpTVInDQzn1f7TIXEVerdj6DDcieFcFAzr
vrFPBBIToPGYMP5ZHOt1qnibUrlkXV1FKQ18qhzHjxnjSr5BzGrlYG/mzD63mcrIDAogwZyaZp+P
sCujXmEY6wKBgQC4mOlGdQGvnMHLPgBn+/28gYTcvXUO2VOHWHxMw8xTuCB+FRi5sX2w/AEqkT7v
6VYNR2bPAl3276iIyOFMQz07dKuPQ+zsnARDcjJh1OvYcuBfsL76/uGd+0jKh/Pw37AFdZaeqnIm
6bWAUa3IGTcDEBEH2JBVGYy2y9pl3P4oJwKBgQCK+RCwNxokWC2X1IOTG+5Z6ULp6vGkgbg3G0B9
PjvhrTFGuQyQ4JTaNsVgv9UvQBPZ/gkZE9AuL4rk04JG3ccWIwPvRfWJ/jPAlwxEo+vxSM8fQmZC
ylW6uKeqOtWpvn9z4Tm6E0UCbD3hoON0vZLiH8ZeP58dP2QoAeU56izOjQKBgQCJ0skgrM2Uc2KR
v3oIKTGaI82yDdYvPv3JaLxtiCavPyMrX871HdrtYEnyoT0vXLS991iAKJFFhEv9zJXCHdXC5WoN
7jYftqDMRp/tQU7RbXuulkURG2oSTQJdDMKKTkia2t+ZGUNfYFD+PH2Wj5TuOXmttPiWQRw5gtxN
/4DXMwKBgHaC4RVm3TA/0c28ktItYFjiK+lufcEBj1NUjQ9JrbbYdSBiuGD6/HXNu1UvW9j6F9Yb
aElIMWCRO65M9qFqcGCdHTjJMjcFkLufLTTnm3IEHTucYYo6OBrTC0F/LHqxt7n/FqzD963BaLw1
ryc2EZh1g76FEM6O4ciLT3Fes9RD
-----END PRIVATE KEY-----

 PublicKey :[B@22869e5d
 PublicKey :-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAilnnOPkv6l54Sz6pNxb9dHTH5xILzXEA
2sN4IlzPFZgcDzBcEpqYcDIphrVs032IXaQla0QyEcRzZeebLUug/GMoYCh5flAuPGUTtvGOdMMj
r5xzshV5DAGJnIXAvewK4ROoEGUV5NrQZRRo2/NOSEddE7y3QNy6pBqRXtGaWXN4jOkUpUMBRgia
qfVm6JBB2wxd2rFMzlQSGd6XjWFU86wnusATLsfLx1kXsJFA3ZoJlFp3+7uQm/o9EkICKXk3qPeF
bpFXwfYzcip9EYUulQcKRIscvJKzDffBDoxuXTM3+VzS2hki7h2HZrHP/HU1LnoVevE5TxrbuzUa
OdmDzQIDAQAB
-----END PUBLIC KEY-----

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAilnnOPkv6l54Sz6pNxb9dHTH5xILzXEA
2sN4IlzPFZgcDzBcEpqYcDIphrVs032IXaQla0QyEcRzZeebLUug/GMoYCh5flAuPGUTtvGOdMMj
r5xzshV5DAGJnIXAvewK4ROoEGUV5NrQZRRo2/NOSEddE7y3QNy6pBqRXtGaWXN4jOkUpUMBRgia
qfVm6JBB2wxd2rFMzlQSGd6XjWFU86wnusATLsfLx1kXsJFA3ZoJlFp3+7uQm/o9EkICKXk3qPeF
bpFXwfYzcip9EYUulQcKRIscvJKzDffBDoxuXTM3+VzS2hki7h2HZrHP/HU1LnoVevE5TxrbuzUa
OdmDzQIDAQAB
-----END PUBLIC KEY-----

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCKWec4+S/qXnhLPqk3Fv10dMfn
EgvNcQDaw3giXM8VmBwPMFwSmphwMimGtWzTfYhdpCVrRDIRxHNl55stS6D8YyhgKHl+UC48ZRO2
8Y50wyOvnHOyFXkMAYmchcC97ArhE6gQZRXk2tBlFGjb805IR10TvLdA3LqkGpFe0ZpZc3iM6RSl
QwFGCJqp9WbokEHbDF3asUzOVBIZ3peNYVTzrCe6wBMux8vHWRewkUDdmgmUWnf7u5Cb+j0SQgIp
eTeo94VukVfB9jNyKn0RhS6VBwpEixy8krMN98EOjG5dMzf5XNLaGSLuHYdmsc/8dTUuehV68TlP
Gtu7NRo52YPNAgMBAAECggEAEG6tL+8o6cVetFE09/4bDIHyXFegXz5Uw6cD1dEAJ6hxbLxpsyv5
fxn2JLHXwybd04FzkFIBQGr86dWgcLjS3idI3GLySzZqx3GZ7diy+ttSmcETXMuAHRTxq02Xnvcy
M5mKFKhs+UmkBt1ttvInEh6nx3haq7GL2YHuUjzDAGyx5fYfRxzzFWGJl3iXGSYf2xe1GZEaot4F
48Y7CKGL9vLk+qHEcjQRNs6ov/LOkXHVef2AV0KWkDz2YyBVIsnEQrOjtska7AkmZMb1b53PU2ex
GCGJrK9HupAbUTzAVxja+AMhnve8GK2X6AzHhHHY32W27NtjiNh9kYudkRwkYQKBgQC/3aJ+jxi6
kCE4XfDVS+hCeziRHyLYiA4y0dLwlIwr1tB3ecGwtZOpTVInDQzn1f7TIXEVerdj6DDcieFcFAzr
vrFPBBIToPGYMP5ZHOt1qnibUrlkXV1FKQ18qhzHjxnjSr5BzGrlYG/mzD63mcrIDAogwZyaZp+P
sCujXmEY6wKBgQC4mOlGdQGvnMHLPgBn+/28gYTcvXUO2VOHWHxMw8xTuCB+FRi5sX2w/AEqkT7v
6VYNR2bPAl3276iIyOFMQz07dKuPQ+zsnARDcjJh1OvYcuBfsL76/uGd+0jKh/Pw37AFdZaeqnIm
6bWAUa3IGTcDEBEH2JBVGYy2y9pl3P4oJwKBgQCK+RCwNxokWC2X1IOTG+5Z6ULp6vGkgbg3G0B9
PjvhrTFGuQyQ4JTaNsVgv9UvQBPZ/gkZE9AuL4rk04JG3ccWIwPvRfWJ/jPAlwxEo+vxSM8fQmZC
ylW6uKeqOtWpvn9z4Tm6E0UCbD3hoON0vZLiH8ZeP58dP2QoAeU56izOjQKBgQCJ0skgrM2Uc2KR
v3oIKTGaI82yDdYvPv3JaLxtiCavPyMrX871HdrtYEnyoT0vXLS991iAKJFFhEv9zJXCHdXC5WoN
7jYftqDMRp/tQU7RbXuulkURG2oSTQJdDMKKTkia2t+ZGUNfYFD+PH2Wj5TuOXmttPiWQRw5gtxN
/4DXMwKBgHaC4RVm3TA/0c28ktItYFjiK+lufcEBj1NUjQ9JrbbYdSBiuGD6/HXNu1UvW9j6F9Yb
aElIMWCRO65M9qFqcGCdHTjJMjcFkLufLTTnm3IEHTucYYo6OBrTC0F/LHqxt7n/FqzD963BaLw1
ryc2EZh1g76FEM6O4ciLT3Fes9RD
-----END PRIVATE KEY-----

2 Encrypt

To encrypt a message using a geerated public key.

Copy
<script>
    var kp = new Ax.crypt.KeyPair("RSA", 2048);
    var rsa = new Ax.crypt.RSA(kp);

    var secret = "This is a secret message";
    // encrypt a string or byte[]
    // string is converted to byte[] using utf-8 encoding
    var msg_encrypted = rsa.encrypt(secret);
    console.log(msg_encrypted);
    console.log("----");
    console.log(rsa.toBase64(msg_encrypted));
</script>
[B@6114ec16
----
ae4k783oFP1ShGFwCg4AP8AYtHdxIsCOqK9dM0ZE444ou8WtJV5BLqh17CAOM2Gd7Uci3ihMVfp7
my357l1EUL4jpHjmSWzRex/RXOC8GnlfI9JCXlgjdOrkKGfffd9d5IvH7mD7VkMqEcvbglw4kpAm
oIKS9uKBauYpZL3SltBTFZD/Rs61JXlIR/+FcJPP1olJ1UhPwPWmND2BcjenKX906iWg4T7o6CuN
SMJm40bzNbodl9QLGyhhxZHK4hidSEgDqdTibO53zAL++d62ODP529S9biChzkM7NQilrQT9YKyg
+G0qtNegywEoYJiPRt3gYTxdRad4c0j8OI0Xog==

3 Decrypt

To decrypt a crypted message.

Copy
<script>
    var kp = new Ax.crypt.KeyPair("RSA", 2048);
    var rsa = new Ax.crypt.RSA(kp);

    var secret = "This is a secret message";
    // msg_encrypted is the encrypted message stored in base64
    var msg_encrypted = rsa.encrypt(secret);

    // msg_decrypted is a byte[] of message.
    var msg_decrypted = rsa.decrypt(msg_encrypted);
    
    // Convert to string before print using rsa toString method.
    console.log(new Ax.lang.String(msg_decrypted, "utf-8"));

</script>
This is a secret message