我正在尝试在Linux内核中计算整数数组的SHA1。我已经浏览过crypto.c
/ crypto.h
和security/integrity/ima/ima_crypto.c
,但我无法弄清楚如何init
然后update
SHA1计算机。有人可以指点我如何去做这个教程或指南吗?
答案 0 :(得分:10)
对Documentation/crypto/api-intro.txt中的linux加密api有一个很好的介绍。另请查看fs/ecryptfs/crypto.c以获取有关如何使用这些函数的实际示例。
这里有一个快速摘要,但是为了让你开始:
创建一些局部变量:
struct scatterlist sg;
struct hash_desc desc;
char *plaintext = "plaintext goes here";
size_t len = strlen(plaintext);
u8 hashval[20];
struct scatterlist
用于以crypto.h
函数可以理解的格式保存您的明文,而struct hash_desc
用于配置散列。plaintext
保存我们的纯文本字符串,而hashval
将保留我们明文的哈希值。len
保留明文字符串的长度。 请注意,虽然我在此示例中使用ASCII明文,但您也可以传递整数数组 - 只需将总内存大小存储在len
中并替换{{1}的每个实例1}}使用整数数组:
plaintext
但请注意:int myarr[4] = { 1, 3, 3, 7 };
size_t len = sizeof(myarr);
元素的大小通常大于一个字节,因此在int
数组中存储整数值不会与{{1}具有相同的内部表示数组 - 你可能最终得到空字节作为值之间的填充。
此外,如果您的目的是散列整数的ASCII表示,您必须先将数组中的值转换为字符串字符序列(可能使用int
)
初始化char
和sprintf
:
sg
请注意,desc
已传递给sg_init_one(&sg, plaintext, len);
desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
;对于MD5哈希或任何其他支持的字符串,可以将其设置为"sha1"
,以便使用相应的哈希方法。
现在使用三个函数调用执行散列:
crypto_alloc_hash
"md5"
根据提供的crypto_hash_init(&desc);
crypto_hash_update(&desc, &sg, len);
crypto_hash_final(&desc, hashval);
配置哈希引擎。crypto_hash_init
在明文上执行实际的哈希方法。struct hash_desc
将哈希值复制到字符数组中。由crypto_hash_update
保留的免费分配内存:
crypto_hash_final