使用RSA进行AES加密通信,以便在Go中进行密钥交换

时间:2014-08-23 08:55:48

标签: encryption go aes rsa

我试图在基于Ruby Sinatra的网络后端和Google Go应用程序之间建立安全通信。 Go应用程序包含公钥并最初打开连接。然后,它使用其公钥加密随机生成的AES,并将其发送到Web后端。所有即将到来的(大尺寸)数据都将使用AES密钥加密。 这一般是一种有用的方法吗?

Go代码如下所示

aesRand := make([]byte, 32)
rand.Read(aesRand)
AESBlock, _ = aes.NewCipher(aesRand)

// Encrypt AES key with RSA
data, err := rsa.EncryptPKCS1v15(rand.Reader, PubKey, aesRand)

现在的问题是,通过线路加密和发送随机字节是正确的,还是应该加密并发送AESBlock?

提前致谢!

1 个答案:

答案 0 :(得分:2)

您应该使用RSA加密并发送aesRand,也称为密钥。

您还需要根据您使用的crypto mode来传递IV。

len(KEY)+ len(IV)必须小于len(PubKey),假设您要在最初的RSA事务中加密它们。

仔细阅读docs for the rsa module,注意每种模式的弱点。您应该使用DecryptPKCS1v15SessionKey来解密上述内容。请注意有关在新协议中使用RSA-OAEP的注释。

如果你这样做是一种学习经历那么很好,但如果这是代码是为了保护信息,如果受到损害将花费真钱,那么我会使用TLS这将完成以上所有以及更多在经过充分测试的框架中。