#### go新手一枚,最近在练习使用go rsa加密内容,出现一个很诡异的问题,采用crypto/x509生成的密钥对,刚开始是可以正常对内容进行加密解密,但是过几天之后对以前加密的内容解密,就提示解密失败。密钥和内容都没有变动。代码如下:
```
/*
* 使用RSA公钥加密
*/
func Decryption(src []byte, keyid string) ([]byte, error) {
pemfile := fmt.Sprintf("./keyfile/%s/%s.pem", keyid, keyid)
file, err := os.Open(pemfile)
if err != nil {
return nil, err
}
defer file.Close()
info, _ := file.Stat()
buf := make([]byte, info.Size())
file.Read(buf)
//从数据中找出pem格式
block, _ := pem.Decode(buf)
if block == nil {
return nil, err
}
//解析一个der编码的公钥
publickey, err := x509.ParsePKCS1PublicKey(block.Bytes)
if err != nil {
return nil, err
}
//密钥加密
//result, _ := rsa.EncryptPKCS1v15(rand.Reader, publickey, src)
result, _ := rsa.EncryptOAEP(md5.New(), rand.Reader, publickey, src, nil)
return result, nil
}
/*
* RSA私钥解密
*/
func RSADecrypt(src []byte, keyid string) ([]byte, error) {
// 根据文件名读出内容
keyfile := fmt.Sprintf("./keyfile/%s/%s.key", keyid, keyid)
file, err := os.Open(keyfile)
if err != nil {
return nil, err
}
defer file.Close()
info, _ := file.Stat()
buf := make([]byte, info.Size())
file.Read(buf)
// 从数据中解析出pem块
block, _ := pem.Decode(buf)
if block == nil {
return nil, err
}
// 解析出一个der编码的私钥 ParsePKCS1PrivateKey
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
// 私钥解密
//result, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, src)
result, err := rsa.DecryptOAEP(md5.New(), rand.Reader, privateKey, src, nil)
if err != nil {
return nil, err
}
return result, nil
}
```
```
/*
* 生成RSA私钥
*/
func RsaGenKey(bits int, privatePath, pubulicPath string) error {
// GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return err
}
// 2. MarshalPKCS1PrivateKey将rsa私钥序列化为ASN.1 PKCS#1 DER编码
derPrivateStream := x509.MarshalPKCS1PrivateKey(privateKey)
// 3. Block代表PEM编码的结构, 对其进行设置
block := pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: derPrivateStream,
}
// 4. 创建文件
privateFile, err := os.Create(privatePath)
defer privateFile.Close()
if err != nil {
return err
}
// 5. 使用pem编码, 并将数据写入文件中
err = pem.Encode(privateFile, &block)
if err != nil {
return err
}
/*
* 生成RSA公钥
*/
publicKey := privateKey.PublicKey
//derPublicStream, err := x509.MarshalPKCS1PublicKey(&publicKey)
derPublicStream := x509.MarshalPKCS1PublicKey(&publicKey)
if err != nil {
return err
}
block = pem.Block{
Type: "RSA PUBLIC KEY",
Bytes: derPublicStream,
}
publicFile, err := os.Create(pubulicPath)
defer publicFile.Close()
if err != nil {
return err
}
// 2. 编码公钥, 写入文件
err = pem.Encode(publicFile, &block)
if err != nil {
panic(err)
}
return nil
}
```
#### 理论上RSA密钥对和时间没有关系的,都是一串字符串而已。不知道问题出在哪里。
有疑问加站长微信联系(非本文作者)