How to use rsa key pair for AES encryption and decryprion in golang

huangapple go评论109阅读模式
英文:

How to use rsa key pair for AES encryption and decryprion in golang

问题

我想生成RSA密钥对(公钥和私钥),然后将它们用于AES加密和解密,例如使用公钥进行加密,私钥进行解密。我写了一个简单的代码,但问题是当我运行这个代码时,我得到以下错误信息:

  1. crypto/aes: invalid key size 1639

我该如何解决这个问题?下面是我的加密代码:

  1. //生成私钥
  2. privateKey, err := rsa.GenerateKey(rand.Reader, 2014)
  3. if err != nil {
  4. return
  5. }
  6. privateKeyDer := x509.MarshalPKCS1PrivateKey(privateKey)
  7. privateKeyBlock := pem.Block{
  8. Type: "RSA PRIVATE KEY",
  9. Headers: nil,
  10. Bytes: privateKeyDer,
  11. }
  12. privateKeyPem := string(pem.EncodeToMemory(&privateKeyBlock))
  13. //使用privateKeyPem进行加密
  14. text := []byte("My name is Astaxie")
  15. ciphertext, err := encrypt(text, []byte(privateKeyPem))
  16. if err != nil {
  17. // TODO: Properly handle error
  18. log.Fatal(err)
  19. }
  20. fmt.Printf("%s => %x\n", text, ciphertext)
  21. //encrypt()函数的定义
  22. func encrypt(plaintext []byte, key []byte) ([]byte, error) {
  23. c, err := aes.NewCipher(key)
  24. if err != nil {
  25. return nil, err
  26. }
  27. gcm, err := cipher.NewGCM(c)
  28. if err != nil {
  29. return nil, err
  30. }
  31. nonce := make([]byte, gcm.NonceSize())
  32. if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
  33. return nil, err
  34. }
  35. return gcm.Seal(nonce, nonce, plaintext, nil), nil
  36. }

请注意,我只翻译了你提供的代码部分,其他内容不包括在内。

英文:

I want to generate RSA key pair(public and private), and then use them for AES encryption and decryption .e.g. Public key for encryption and private key for decryption. I wrote a simple code for this, but the problem is that when I run this code I get this error:

  1. crypto/aes: invalid key size 1639

How can I resolve this problem ?? My encryption code is given below:

  1. //genrating private key
  2. privateKey, err := rsa.GenerateKey(rand.Reader, 2014)
  3. if err != nil {
  4. return
  5. }
  6. privateKeyDer := x509.MarshalPKCS1PrivateKey(privateKey)
  7. privateKeyBlock := pem.Block{
  8. Type: "RSA PRIVATE KEY",
  9. Headers: nil,
  10. Bytes: privateKeyDer,
  11. }
  12. privateKeyPem := string(pem.EncodeToMemory(&privateKeyBlock))
  13. //using privateKeyPem for encryption
  14. text := []byte("My name is Astaxie")
  15. ciphertext, err := encrypt(text, []byte(privateKeyPem))
  16. if err != nil {
  17. // TODO: Properly handle error
  18. log.Fatal(err)
  19. }
  20. fmt.Printf("%s => %x\n", text, ciphertext)
  21. //Definition of encrypt()
  22. func encrypt(plaintext []byte, key []byte) ([]byte, error) {
  23. c, err := aes.NewCipher(key)
  24. if err != nil {
  25. return nil, err
  26. }
  27. gcm, err := cipher.NewGCM(c)
  28. if err != nil {
  29. return nil, err
  30. }
  31. nonce := make([]byte, gcm.NonceSize())
  32. if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
  33. return nil, err
  34. }
  35. return gcm.Seal(nonce, nonce, plaintext, nil), nil
  36. }

答案1

得分: 0

根据评论的建议,我搜索了"混合加密"。这个示例解决了我的问题。

英文:

As suggested in comments, i searched "hybrid cryptography" . And this example has solved my problem.

huangapple
  • 本文由 发表于 2017年4月18日 11:45:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/43463221.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定