Person:
- JavaScript实现非对称加密
ChatGPT:
- JavaScript 可以使用公钥密码学算法来实现非对称加密。常用的公钥密码学算法包括 RSA 和 ECC。
下面是一个使用 RSA 算法实现非对称加密的示例:
// 生成 RSA 密钥对
const { publicKey, privateKey } = await window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 65537
hash: "SHA-256",
},
true,
["encrypt", "decrypt"]
);
// 加密数据
const plaintext = "Hello, world!";
const encryptedData = await window.crypto.subtle.encrypt(
{
name: "RSA-OAEP",
},
publicKey,
new TextEncoder().encode(plaintext)
);
// 解密数据
const decryptedData = await window.crypto.subtle.decrypt(
{
name: "RSA-OAEP",
},
privateKey,
encryptedData
);
const decryptedText = new TextDecoder().decode(decryptedData);
console.log(decryptedText); // 输出 "Hello, world!"
上面的代码中,首先使用 generateKey
函数生成一个 RSA 密钥对,其中包括公钥和私钥。然后使用 encrypt
函数对数据进行加密,使用 decrypt
函数对加密后的数据进行解密。在加密和解密时都需要指定加密算法,这里使用了 RSA-OAEP 算法。
需要注意的是,在使用非对称加密时,加密和解密所使用的密钥不同,因此需要妥善保管私钥,不要泄露给第三方。
ChatGPT:
- 如果你要使用 Go 语言对前面示例代码中的加密结果进行解密,可以使用 Go 标准库中的
crypto/rsa
包。
下面是一个示例代码,它可以将前面示例代码中使用 RSA 算法加密的数据解密回原始数据:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
)
func main() {
// 从字符串中解析 RSA 密钥对
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
publicKey := &privateKey.PublicKey
// 从加密的数据中解密出原始数据
encryptedData := []byte{ /* 加密后的数据 */ }
decryptedData, err := rsa.DecryptOAEP(
sha256.New(),
rand.Reader,
privateKey,
encryptedData,
nil,
)
if err != nil {
panic(err)
}
fmt.Println(string(decryptedData)) // 输出 "Hello, world!"
}
在这个示例中,我们首先使用 rsa.GenerateKey
函数生成一个 RSA 密钥对,然后使用 rsa.DecryptOAEP
函数将加密的数据解密回原始数据。
需要注意的是,在解密时需要使用与加密时相同的填充算法和哈希算法。这里使用了 OAEP 填充和 SHA-256 哈希算法。同时,解密操作的私钥必须与加密操作的公钥相对应。
另外,这个示例中的加密数据 encryptedData
需要从前面的加密代码中获取,然后将其填入到代码中。