Linux中crypt函数的时间复杂度是多少?
unix中用于身份验证的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位密钥 然后使用经过调整的算法将由此获得的密钥用于加密常量字符串,这需要
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;i