Linux中crypt函数的时间复杂度是多少?

Linux中crypt函数的时间复杂度是多少?,c,linux,algorithm,crypt,C,Linux,Algorithm,Crypt,unix中用于身份验证的crypt函数如下所述: char *crypt(const char *key, const char *salt); 假设我有长度为n的密钥,长度为m的salt,调用此函数的算法的时间复杂度顺序是什么 来自crypt的手册页: salt是从集合[a-zA-Z0-9./]中选择的两个字符的字符串。此字符串用于以4096种不同方式之一干扰算法 及 通过获取密钥前八个字符中每个字符的最低7位,获得56位密钥 然后使用经过调整的算法将由此获得的密钥用于加密常量字符串,这需要

unix中用于身份验证的crypt函数如下所述:

char *crypt(const char *key, const char *salt);
假设我有长度为n的密钥,长度为m的salt,调用此函数的算法的时间复杂度顺序是什么

来自crypt的手册页:

salt是从集合[a-zA-Z0-9./]中选择的两个字符的字符串。此字符串用于以4096种不同方式之一干扰算法

通过获取密钥前八个字符中每个字符的最低7位,获得56位密钥

然后使用经过调整的算法将由此获得的密钥用于加密常量字符串,这需要恒定的时间。因此,对于任何有效参数,函数都具有恒定的运行时。请注意,这种截断会导致非常弱的密码

正如所评论的,一些实现提供了对crypt函数的扩展,允许选择更安全的模式。对于以下内容,我将假设您正在使用GNUC库中的crypt函数。说:

对于基于MD5的算法,salt应该由字符串$1$组成,后跟最多8个字符,以另一个$或字符串结尾。crypt的结果将是salt,如果salt没有以1结尾,则后跟$,然后是字母表中的22个字符。/0-9A-Za-z,最多34个字符。键中的每个字符都是有意义的

由于salt的长度由一个常数固定,并且加密哈希函数的时间复杂度在输入长度上是线性的,因此crypt函数的总体时间复杂度在密钥上是线性的

我的glibc版本还支持更安全的selected via$5$和selected via$6$加密散列函数。它们的输入长度也具有线性时间复杂性

由于我无法理解我现在实际要做的任务,因此我对各种crypt方法进行了计时,以支持上述分析。以下是结果

绘制的是crypt函数的执行时间与密钥字符串的长度。每个数据系列都用线性回归覆盖,但DES除外,DES绘制的是平均值。我很惊讶SHA-512实际上比SHA-256快

用于基准测试的代码在这里是benchmark.c

定义_GNU_SOURCE/*crypt*/ 包括/*errno,strerror*/ 包括/*文件、fopen、fclose、fprintf*/ 包括/*退出{SUCCESS,FAILURE},malloc,free,[s]rand*/ 包括/*尺寸,斯特伦*/ 包括/*断言*/ 包括/*时钟/秒、时钟、时钟*/ 包括/*密码*/ /*阻止编译器对指令重新排序的障碍*/ 定义编译器\u asm volatile:::内存 /*可打印ASCII范围中的第一个字符*/ 静态常量字符ascii_first=''; /*可打印ASCII范围中的最后一个字符*/ 静态常量字符ascii_last='~'; /* 用salt对长度为*keylen*的密钥进行加密所需的时间进行基准测试 *盐*。结果被写入流*ostr*,因此无法进行计算 被优化掉。 */ 静态时钟 度量\u cryptcont size\u t keylen,const char*const salt,FILE*const ost { 字符*键; 常量字符*passwd; 时钟t1; 时钟t2; 尺寸i; 键=mallockeylen+1; 如果key==NULL 返回时钟_t-1; /* 生成一个随机密钥。随机性非常差;永远不要在 加密应用程序! */ 对于i=0;i1 salt=argv[1]; devnull=fopen/dev/null,r; 如果devnull==NULL 后进先出; 随机无符号时钟; 对于keylen=0;keylen$@ timings.md5:基准测试 ./$<'$$1$$$shell pwgen-ncs 8'>$@ timings.sha256:基准测试 ./$<'$$5$$$shell pwgen-ncs 16'>$@ timings.sha512:基准测试 ./$<'$$6$$$shell pwgen-ncs 16'>$@ 清洁: rm-f benchmark.o fit.log$通配符*.o计时* .骗子:都是干净的 请注意,有些密码支持额外的散列算法,如MD5或SHA-1,由$X$Y$形式的salt选择,其中X表示算法,Y表示实际salt。这些密码通常使用所有输入,因此我猜复杂性将取决于+m密码长度+salt长度。@melpo 梅妮,你说得对。你想发布你自己的答案还是我可以把这些信息加入我的答案中?