Erlang 只需编写一个测试函数并报告一个参数错误

Erlang 只需编写一个测试函数并报告一个参数错误,erlang,aes,Erlang,Aes,这是我的代码,主要使用加密应用程序: -module(test). -export([test/0]). test()-> application:start(crypto), Type = aes_cbc128, Key = <<"3R9p7eUVAw31ULQG">>, IVec = <<0:128>>, crypto:block_encrypt(Type, Key,

这是我的代码,主要使用
加密
应用程序:

-module(test).
-export([test/0]).

test()->        
    application:start(crypto),
    Type = aes_cbc128,      
    Key = <<"3R9p7eUVAw31ULQG">>,
    IVec = <<0:128>>,
    crypto:block_encrypt(Type, Key, IVec, {<<"M2UsytYCU4FD70y5">>,<<"123456">>}).
-模块(测试)。
-导出([test/0])。
测试()->
应用:启动(加密),
类型=aes_cbc128,
键=,
IVec=,
加密:块加密(类型,密钥,IVec,{,})。

您混淆了两个函数签名。这对我很有用:

test()->        
    application:start(crypto),

    Type = aes_gcm, 
    %Type = aes_cbc128,      
    Key = <<"3R9p7eUVAw31ULQG">>,
    IVec = <<0:128>>,
    crypto:block_encrypt(Type, Key, IVec, {<<"M2UsytYCU4FD70y5">>,<<"123456">>}).
在该函数子句中,
明文
必须是类型
iodata()
,无论
iodata()
可能是什么,它都不是元组

如果为第4个参数指定了一个两元素元组,则匹配此函数子句:

block_encrypt(AeadType, Key, Ivec, {AAD, PlainText})
并且,在该函数子句中,
AeadType
的类型是
aead\u cipher()
,在页面的其他地方定义为:

aead_cipher() = aes_gcm | chacha20_poly1305
换句话说,
aes\u cbc128
是变量
AeadType
的“坏参数”

请注意,文档中定义类型
aead\u cipher()
的部分没有格式设置——所有类型定义都在一个大的类型定义中运行,因此很难判断发生了什么。应该是这样的:

stream_cipher() = rc4 | aes_ctr 

block_cipher() = aes_cbc | aes_cfb8 | aes_cfb128 | aes_ige256 | blowfish_cbc 
     | blowfish_cfb64 | des_cbc | des_cfb | des3_cbc | des3_cfb | des_ede3 | rc2_cbc 

aead_cipher() = aes_gcm | chacha20_poly1305 
stream_key() = aes_key() | rc4_key() 
block_key() = aes_key() | blowfish_key() | des_key()| des3_key() 
aes_key() = iodata()

.

函数crypto:bloc\u encrypt/4接受多组参数:

块加密(类型、密钥、Ivec、明文)->密文错误

块加密(AeadType,密钥,Ivec,{AAD,明文})->{CipherText,CipherTag}错误

块加密(aes_gcm | aes_ccm,密钥,Ivec,{AAD,明文,TagLength})->{CipherText,CipherTag}错误

在代码中,您选择了第二个。在这种情况下,必须使用“aead_cypher”作为第一个参数

aead_cipher()=aes_gcm | aes_ccm | chacha20_poly1305

如果要使用类型参数,则它是第一组参数,必须仅将纯文本用作最后一个参数,而不是{AAD,Plaintext}。顺便说一句,您在示例中选择的类型不正确,我想您需要aes_128_cbc

1> application:start(crypto). 
ok
2> Type = aes_128_cbc.
aes_128_cbc
3> Key = <<"3R9p7eUVAw31ULQG">>.
<<"3R9p7eUVAw31ULQG">>
4> IVec = <<0:128>>.
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
5> Aes = aes_gcm.
aes_gcm
6> crypto:block_encrypt(Type, Key, IVec, <<"1234567890123456789">>).
<<242,220,105,109,252,235,224,216,46,180,149,145,37,129,
  35,194>>
7>  crypto:block_encrypt(Aes, Key, IVec, {<<"M2UsytYCU4FD70y5">>,<<"1234567890123456789">>}).   
{<<53,37,50,226,74,42,229,68,133,9,224,144,125,216,121,49,
   13,225,4>>,
 <<188,96,67,137,208,176,32,237,177,144,147,152,84,130,
   225,98>>}
8>
1>应用程序:启动(加密)。
好啊
2> 类型=aes_128_cbc。
aes_128_cbc
3> 键=。
4> IVec=。
5> Aes=Aes\u gcm。
aes_gcm
6> 加密:块加密(类型、密钥、IVec等)。
7> 加密:块加密(Aes,密钥,IVec,{,})。
{,
}
8>

我是新人,帮手你收到了什么错误信息?公然剽窃。好吧,亲爱的7stud,我通常会捕捉一些问题,然后在车上上班或回家时写下答案。因此,当我发布答案时,我不想检查是否已经有答案。显然这个问题只有一个可能的答案,所以我的答案和你的一样。但是如果你的自我受到伤害,我可能会考虑去除它。顺便说一句,您没有注意到原始消息太短,无法使用aes_128_cbc,这就是我使用较长消息的原因。因此,当我发布答案时,我不想检查是否已经有答案。--其他人都有。而且,我的回答中有一个错误,你似乎也犯了…嗯。@linanjing,实际上,我刚刚查看了源代码,你的函数调用匹配的第一个函数子句是:
block\u encrypt(Type,Key0,Ivec,Data)->…
。请注意,当保护时没有
,因此
数据
将匹配任何内容,例如元组。然后,函数体使用case语句检查数据,case语句被包装在一个宏中,该宏在发生错误时调用
error(badarg)
。源代码太复杂,我无法精确指出元组是如何导致错误的,然后触发对
error(badarg)
的调用。我有OTP 22,crypto-4.5版本,源代码对我来说似乎很清楚。@Pascal,太棒了!现在回到剽窃别人的答案上来。我将要回答另一个问题,所以请务必再次复制我的答案。
stream_cipher() = rc4 | aes_ctr 

block_cipher() = aes_cbc | aes_cfb8 | aes_cfb128 | aes_ige256 | blowfish_cbc 
     | blowfish_cfb64 | des_cbc | des_cfb | des3_cbc | des3_cfb | des_ede3 | rc2_cbc 

aead_cipher() = aes_gcm | chacha20_poly1305 
stream_key() = aes_key() | rc4_key() 
block_key() = aes_key() | blowfish_key() | des_key()| des3_key() 
aes_key() = iodata()
1> application:start(crypto). 
ok
2> Type = aes_128_cbc.
aes_128_cbc
3> Key = <<"3R9p7eUVAw31ULQG">>.
<<"3R9p7eUVAw31ULQG">>
4> IVec = <<0:128>>.
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
5> Aes = aes_gcm.
aes_gcm
6> crypto:block_encrypt(Type, Key, IVec, <<"1234567890123456789">>).
<<242,220,105,109,252,235,224,216,46,180,149,145,37,129,
  35,194>>
7>  crypto:block_encrypt(Aes, Key, IVec, {<<"M2UsytYCU4FD70y5">>,<<"1234567890123456789">>}).   
{<<53,37,50,226,74,42,229,68,133,9,224,144,125,216,121,49,
   13,225,4>>,
 <<188,96,67,137,208,176,32,237,177,144,147,152,84,130,
   225,98>>}
8>