如何正确使用Plug.Crypto.decrypt?解密字符串遇函数匹配错误
正确解密Plug.Crypto加密字符串的方法
问题原因
你调用的decrypt/2和decrypt/3都不是Plug.Crypto提供的合法函数签名,Plug.Crypto仅提供decrypt/4用于解密,因此触发FunctionClauseError。
正确解密步骤
当你使用Plug.Crypto.encrypt/3(即Plug.Crypto.encrypt(key, plaintext, opts))加密时,函数会自动生成随机初始化向量(IV),并将IV + 密文拼接成一个二进制返回。解密时需要先拆分出IV和密文,再调用decrypt/4:
拆分IV与密文
Plug.Crypto默认使用AES-GCM算法,对应的IV长度为12字节,按此长度拆分:iv_size = 12 <<iv::binary-size(iv_size), ciphertext::binary>> = enc_str调用decrypt/4解密
使用加密时的密钥、拆分出的IV和密文,加上选项参数(空列表即可)执行解密:raw_string = Plug.Crypto.decrypt("my_secret", ciphertext, iv, [])
关键文档要点翻译
官方decrypt/4函数说明
Plug.Crypto.decrypt(key, ciphertext, iv, opts \\ [])
- 功能:通过指定密钥、密文、初始化向量(IV)和选项完成解密
- 参数:
key:加密时使用的密钥,需符合对应算法的长度要求(AES-GCM支持16/24/32字节密钥)ciphertext:加密后的纯密文部分(需从encrypt/3返回的二进制中拆分)iv:加密时生成的初始化向量,必须与加密时的IV完全一致opts:可选配置列表,例如:algorithm可指定加密算法(默认:aes_gcm)
- 返回值:成功返回明文,失败则抛出错误
第三方博客核心结论
Plug.Crypto.encrypt/3会自动生成随机IV,并将IV与密文拼接后返回- 解密必须先拆分IV和密文,再调用
decrypt/4 - 密钥安全性和合规长度是加密/解密成功的前提,AES-GCM还会自动验证密文完整性,篡改后的密文无法解密
内容的提问来源于stack exchange,提问作者addUsername
相关产品推荐
相关产品推荐

