golang加、解密使用php的openssl_encrypt加

2022-07-05  本文已影响0人  Super淳语

在PHP(PHP 5 >= 5.3.0, PHP 7, PHP 8)中,openssl_encrypt的参数大致如下:

openssl_encrypt(
    string $data,
    string $cipher_algo,
    string $passphrase,
    int $options = 0,
    string $iv = "",
    string &$tag = null,
    string $aad = "",
    int $tag_length = 16
): string|false

其中$data待加密的数据字符串,这很好理解,这里不做过多阐释。

若 passphrase 比预期长度短,将静默用 NUL 填充; 若比预期长度更长,将静默截断。

查了PHP源代码下的openssl实现,找到如下

if (key_len > password_len) {
  if ((OPENSSL_DONT_ZERO_PAD_KEY & options) && !EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len)) {
      php_openssl_store_errors();
      php_error_docref(NULL, E_WARNING, "Key length cannot be set for the cipher algorithm");
      return FAILURE;
  }
  key = emalloc(key_len);
  memset(key, 0, key_len); 
  memcpy(key, *ppassword, password_len);
  *ppassword = (char *) key;
  *ppassword_len = key_len;
  *free_password = 1;
}
0 : 默认值,PKCS#7进行填充, 返回的数据经过 base64 编码;
1 : OPENSSL_RAW_DATA, PKCS#7进行填充, 但返回的结果未经过 base64 编码;
2 : OPENSSL_ZERO_PADDING, openssl不推荐chr(0)填充的方式, 需要开发者自行填充, 返回的结果经过 base64 编码;
3 : OPENSSL_NO_PADDING, 需要开发者自行填充, 返回的结果不经过base64编码;
$iv 初始向量(Initialization Vector),不同的IV加密后的字符串是不同的,加密和解密需要相同的IV,既然IV看起来和key一样,却还要多一个IV的目的,对于每个块来说,key是不变的,但是只有第一个块的IV是用户提供的,其他块IV都是自动生成。 IV的长度为16字节。 超过或者不足,可能实现的库都会进行补齐或截断。ECB方式不需要iv,所以之前以ECB举例也是为了快速上手。
$tag 使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签。
$aad 附加的验证数据。
$tag_length 验证 tag 的长度。GCM 模式时,它的范围是 4 到 16。

go 相关包

github.com/wumansgy/goEncrypt

相关go代码使用

func GetEncodeId(actId string) string {
    s := make([]byte, 32)
    copy(s, []byte(AES_KEY))
    str, err := goEncrypt.AesCtrEncrypt([]byte(actId), s, []byte(IV_KEY))
    if err != nil {
        return "0"
    }
    hexStringData := hex.EncodeToString(str)
    return hexStringData
}
上一篇 下一篇

猜你喜欢

热点阅读