我正在与此example一起尝试使用AES-256加密数据。但是,当我使用密码WeakPasswordForTesting
作为输入时,出现错误:crypto/aes: invalid key size
。我觉得这与我的普通密码长度有关。如何使用此示例代码使用简短的纯文本密码来加密数据?
func Encrypt(password []byte, plainSource []byte) ([]byte, error) {
key, _ := hex.DecodeString(string(password))
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
// The IV needs to be unique, but not secure. Therefore it's common to
// include it at the beginning of the ciphertext.
ciphertext := make([]byte, aes.BlockSize+len(plainSource))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}
stream := cipher.NewCTR(block, iv)
stream.XORKeyStream(ciphertext[aes.BlockSize:], plainSource)
return ciphertext, nil
}
答案 0 :(得分:3)
Advanced Encryption Standard (AES)是block cipher,它期望键的大小固定。密钥长度在密码名称中:AES- 256 表示密钥长度为256位。
由于您的密码不是符合此规范的密钥,因此您需要实施一个流程以使其符合要求。常见的机制是密钥推导函数,该函数采用熵输入密码短语,该短语的密码显着低于所需的密钥长度,并用各种数据填充以生成所需长度的密钥。 PBKDF family(基于密码的密钥派生函数)就是一个示例,scrypt也是如此。
您不应实施幼稚的机制来以这种方式填充输入数据,因为好的密码系统的安全性完全取决于密钥的质量,而且任何本地出产的解决方案都不太可能会抵御多种攻击攻击。
This question关于crypto.SE,对于使用PBKDF2对实施建议进行更彻底的评估可能会很有趣。