go - 如何解密在 Go 中使用固定盐生成的字符串?

标签 go encryption

我有大量使用 Jasypt 加密的数据,我需要在 Go 上对其进行解密。固定盐和随机盐。

我找到了 this repo带有 BasicTextEncryptor 的工作端口。它适用于我使用密码和随机盐加密的数据。

我尝试用我的固定字符串替换随机盐,虽然我没有收到任何错误,但它没有返回实际的加密内容。

func FDecrypt(password, cipherText, salt string, obtenationIterations int) (string, error) {
    msgBytes, err := base64.StdEncoding.DecodeString(cipherText)
    if err != nil {
        return "", err
    }

    //salt := msgBytes[:8]
    encText := msgBytes[8:]

    dk, iv := getDerivedKey(password, salt, obtenationIterations)
    block, err := des.NewCipher(dk)

    if err != nil {
        return "", err
    }

    decrypter := cipher.NewCBCDecrypter(block, iv)
    decrypted := make([]byte, len(encText))
    decrypter.CryptBlocks(decrypted, encText)

    decryptedString := strings.TrimRight(string(decrypted), "\x01\x02\x03\x04\x05\x06\x07\x08")

    return decryptedString, nil
}

func getDerivedKey(password string, salt string, count int) ([]byte, []byte) {
    key := md5.Sum([]byte(password + salt))
    for i := 0; i < count - 1; i++ {
        key = md5.Sum(key[:])
    }
    return key[:8], key[8:]
}

我为测试加密了以下内容(在 Jasypt 中):

  • 内容:加密测试
  • 密码:密码
  • 盐:fixed_salt

加密结果为:IcszAY8NRJf6ANt152Fifg==

当使用上面的代码在 Go 上解密时,我得到:�p�=�

有什么建议吗?

最佳答案

很抱歉回答我自己的问题!

之前,我链接了一个 Github repository使用我用作基础的代码来解决我的问题。正如马库斯在评论中所建议的那样,我在那里开了一个问题。 repo 所有者 (Lucas Sloan) 给了我一些提示。在检查了 jasypt 源代码并弄乱了我之前发布的代码之后,我终于找到了解决方案。

这是工作代码:

func Decrypt(password, cipherText, fixedSalt string, obtenationIterations int) (string, error) {
    msgBytes, err := base64.StdEncoding.DecodeString(cipherText)
    if err != nil {
        return "", err
    }

    salt := make([]byte, 8)
    copy(salt[:], fixedSalt)
    encText := msgBytes[:]

    dk, iv := getDerivedKey(password, salt, obtenationIterations)
    block, err := des.NewCipher(dk)

    if err != nil {
        return "", err
    }

    decrypter := cipher.NewCBCDecrypter(block, iv)
    decrypted := make([]byte, len(encText))
    decrypter.CryptBlocks(decrypted, encText)

    decryptedString := strings.TrimRight(string(decrypted), "\x01\x02\x03\x04\x05\x06\x07\x08")

    return decryptedString, nil
}

func getDerivedKey(password string, salt string, count int) ([]byte, []byte) {
    key := md5.Sum([]byte(password + salt))
    for i := 0; i < count - 1; i++ {
        key = md5.Sum(key[:])
    }
    return key[:8], key[8:]
}

我遗漏了两个要点:

  1. Jasypt 将 salt 修剪为 8 字节数组:
salt := make([]byte, 8)
copy(salt[:], fixedSalt)
  1. 当您使用固定盐加密时,盐不会附加到结果中,因此您需要在解密时获取全部内容:
encText := msgBytes[:]

我对该存储库进行了 PR,因此您可以根据需要使用它。该包还具有加密功能(固定盐和随机盐):https://github.com/LucasSloan/passwordbasedencryption

关于go - 如何解密在 Go 中使用固定盐生成的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57085776/

相关文章:

go - 从 Go 闭包返回一个方法

unit-testing - Google App Engine 数据存储 - 测试查询失败

iphone - 使用随机盐和初始化向量的 AES 128 加密/解密

java - 在首选项/属性文件中加密密码 - Java

php - openssl_encrypt 返回 false

Java 加密并将 vector 保存到文件

Google Cloud 函数使用服务帐户域范围访问调用 Gmail API

go - Bcrypt 为相同的密码生成不同的散列

rest - 无法让 HMACsha256 产生预期结果

http - golang http服务器不接受post大数据