golang 使用crypto生成密钥对进行内容加密过几天后无法正常解密内容

joket · · 1152 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

#### 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密钥对和时间没有关系的,都是一串字符串而已。不知道问题出在哪里。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1152 次点击  
加入收藏 微博
4 回复  |  直到 2022-02-21 15:00:30
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传