如何使用纯文本密码加密AES256 CTR?

时间:2018-09-21 14:31:36

标签: go encryption aes

我正在与此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
}

1 个答案:

答案 0 :(得分:3)

Advanced Encryption Standard (AES)block cipher,它期望键的大小固定。密钥长度在密码名称中:AES- 256 表示密钥长度为256位。

由于您的密码不是符合此规范的密钥,因此您需要实施一个流程以使其符合要求。常见的机制是密钥推导函数,该函数采用熵输入密码短语,该短语的密码显着低于所需的密钥长度,并用各种数据填充以生成所需长度的密钥。 PBKDF family(基于密码的密钥派生函数)就是一个示例,scrypt也是如此。


您不应实施幼稚的机制来以这种方式填充输入数据,因为好的密码系统的安全性完全取决于密钥的质量,而且任何本地出产的解决方案都不太可能会抵御多种攻击攻击。

This question关于crypto.SE,对于使用PBKDF2对实施建议进行更彻底的评估可能会很有趣。