c语言密码由大写字母,C语言实现密码强度检测

本文实例为大家分享了C语言实现密码强度检测,供大家参考,具体内容如下

1 方案得分项

一、密码长度:

公式 :+(n*4),其中n表示密码长度

二、大写字母:

公式:+((len-n)*2),其中n表示大写字母个数,len表示密码长度

三、小写字母:

公式:+((len-n)*2),其中n表示小写字母个数,len表示密码长度

四、数字:

公式:+(n*4),其中n表示数字个数

条件:满足n < len,才能得到加分,len表示密码长度

五、符号:

公式:+(n*6),其中n表示符号个数

六、位于中间的数字或符号:

公式:+(n*2),其中n表示位于中间的数字或符号个数

七、最低条件得分:

公式:+(n*2),其中n表示满足的最低条件条目数

条件:只有满足最低条件,才能得到加分

其中最低条件的条目如下:

1.密码长度不小于8位

2.包含大写字母

3.包含小写字母

4.包含数字

5.包含符号

最低条件要求满足条目1并至少满足条目2-5中的任意三条。

2 方案减分项

一、只有字母:

公式:-n,其中n表示字母个数

二、只有数字:

公式:-n,其中n表示数字个数

三、重复字符数(大小写敏感):

该项描述复杂,具体计算方法见如下示例程序:

2020318150239758.jpg

四、连续大写字母:

公式:-(n*2),其中n表示连续大写字母出现的次数

举例:如输入AUB,则n=2

五、连续小写字母:

公式:-(n*2),其中n表示连续小写字母出现的次数

举例:如输入aub,则n=2

六、连续数字:

公式:-(n*2),其中n表示连续数字出现的次数

举例:如输入381,则n=2

七、正序或逆序字母:

公式:-(n*3),其中n表示连续发生的次数

正序或逆序是指字母表中的顺序

不区分大小写

条件:只有连续3个字母或以上,才会减分,

例1:如输入ABC,则n=1

例2:如输入dcBA,则n=2

八、正序或逆序数字:

公式:-(n*3),其中n表示连续发生的次数

条件:只有连续3个数字或以上,才会减分

例1:如输入123,则n=1,

例2:如输入4321,则n=2

例3:如输入12,则不会减分

九、正序或逆序符号:

公式:-(n*3),其中n表示连续发生的次数

条件:只有连续3个符号或以上,才会减分

3 方案等级划分

根据密码评分,将密码划分成以下5个等级:

>= 80: 非常强(VERY_STRONG)

>= 60: 强(STRONG)

>= 40: 好(GOOD)

>= 20: 弱(WEAK)

>= 0: 非常弱( VERY_WEAK)

int passwdmeter(char *passwd)

{

int i = 0;

//1.密码长度

int passwdlen;

passwdlen = strlen(passwd);

//2~5.大小写字母个数,数字个数,符号个数

int UppercaseLetters = 0;

int LowercaseLetters = 0;

int Numbers = 0,Symbols = 0;

for(i = 0;i < passwdlen; i++)

{

if (passwd[i]>='a' && passwd[i] <= 'z')

LowercaseLetters++;

else if (passwd[i]>='A' && passwd[i] <= 'Z')

UppercaseLetters++;

else if(passwd[i]>='0' && passwd[i] <= '9')

Numbers++;

else

Symbols++;

}

//6.位于中间的数字或符号

int MiddleNumbersorSymbols = Numbers+Symbols;

if (passwd[0]>='a' && passwd[0] <= 'z') ;

else if (passwd[0]>='A' && passwd[0] <= 'Z') ;

else if(passwd[0]>='0' && passwd[0] <= '9')

MiddleNumbersorSymbols--;

else

MiddleNumbersorSymbols--;

if (passwd[passwdlen - 1]>='a' && passwd[passwdlen - 1] <= 'z') ;

else if (passwd[passwdlen - 1]>='A' && passwd[passwdlen - 1] <= 'Z') ;

else if(passwd[passwdlen - 1]>='0' && passwd[passwdlen - 1] <= '9')

MiddleNumbersorSymbols--;

else

MiddleNumbersorSymbols--;

//7.最低条件得分

int Requirements = 0;

if(UppercaseLetters > 0)Requirements++;

if(LowercaseLetters > 0)Requirements++;

if(Numbers > 0)Requirements++;

if(Symbols > 0)Requirements++;

if(passwdlen > 8)Requirements++;

//总加得分

int Bonus = passwdlen*4 + Symbols*6 + MiddleNumbersorSymbols*2;

if (UppercaseLetters)Bonus+= (passwdlen - UppercaseLetters)*2;

if (LowercaseLetters)Bonus+= (passwdlen - LowercaseLetters)*2;

if (Requirements > 3)Bonus+= Requirements*2;

if (Numbers != passwdlen)Bonus+= Numbers*4;

//1.只有字母

int LettersOnly = 0;

if (UppercaseLetters + LowercaseLetters == passwdlen)

LettersOnly = passwdlen;

//2.只有数字

int NumbersOnly = 0;

if (Numbers == passwdlen)

NumbersOnly = passwdlen;

//3.重复字符数(大小写敏感)

int RepeatCharacters = 0;

int repChar = 0;

for(i = 0; i < passwdlen; i++) {

int exists = 0;

int j = 0;

for (j = 0; j < passwdlen; j++) {

if (passwd[i] == passwd[j] && i != j) {

exists = 1;

RepeatCharacters += abs(passwdlen/(j-i));

}

}

if (exists) {

repChar++;

int unqChar = passwdlen - repChar;

RepeatCharacters = (unqChar) ? ceil(RepeatCharacters/(double)unqChar) : ceil(RepeatCharacters);

}

}

//4~6.连续大小写字母,数字

int ConsecutiveUppercaseLetters = 0;

int ConsecutiveLowercaseLetters = 0;

int ConsecutiveNumbers = 0;

int flag = 0;//1-小写,2-大写,3-数字

int count = 0;

for(i = 0 ;i < passwdlen;i++)

{

if(i == 0){

if (passwd[i]>='a' && passwd[i] <= 'z'){flag = 1;count = 1;}

else if (passwd[i]>='A' && passwd[i] <= 'Z'){flag = 2;count = 1;}

else if(passwd[i]>='0' && passwd[i] <= '9'){flag = 3;count = 1;}

}else

{

int tmpflag = 0;

if (passwd[i]>='a' && passwd[i] <= 'z')

{

tmpflag = 1;

}

else if (passwd[i]>='A' && passwd[i] <= 'Z')

{

tmpflag = 2;

}

else if(passwd[i]>='0' && passwd[i] <= '9')

{

tmpflag = 3;

}else

{

tmpflag = 0;

}

if(tmpflag == flag)

count++;

else

{

if(count >= 2)

{

switch(flag)

{

case 1:

ConsecutiveLowercaseLetters += count-1;break;

case 2:

ConsecutiveUppercaseLetters += count-1;break;

case 3:

ConsecutiveNumbers += count-1;break;

default:

break;

}

}

flag = tmpflag;

count = 1;

}

}

}

if(count >= 2)

{

switch(flag)

{

case 1:

ConsecutiveLowercaseLetters += count-1;break;

case 2:

ConsecutiveUppercaseLetters += count-1;break;

case 3:

ConsecutiveNumbers += count-1;break;

default:

break;

}

}

//7~9 正序或者逆序的字母数字及符号

int SequentialLetters = 0;

int Sequenflag = 0;//1-正序,2-反序

int Sequencount = 1;

for(i = 1 ;i < passwdlen;i++)

{

int value = passwd[i];

if(passwd[i]>='a' && passwd[i] <= 'z' && passwd[i-1]>='A' && passwd[i-1] <= 'Z')

value = passwd[i] - 32;

else if(passwd[i-1]>='a' && passwd[i-1] <= 'z' && passwd[i]>='A' && passwd[i] <= 'Z')

value = passwd[i] + 32;

int tmpflag = 0;

if (value - 1 == passwd[i-1])

{

tmpflag = 1;

}else if (value + 1 == passwd[i-1])

tmpflag = 2;

else

tmpflag = 0;

if(Sequenflag == 0 && tmpflag != 0)

{

Sequencount = 1;

Sequenflag = tmpflag;

}

if (tmpflag == Sequenflag)

{

Sequencount++;

}else

{

if(Sequencount >= 3 && Sequenflag != 0)

SequentialLetters += Sequencount-2;

Sequencount = 1;

Sequenflag = tmpflag;

}

}

if(Sequencount >= 3 && Sequenflag != 0)

SequentialLetters += Sequencount-2;

//减分项计算

int Bonus2 = LettersOnly + NumbersOnly + RepeatCharacters + (ConsecutiveUppercaseLetters+ConsecutiveLowercaseLetters+ConsecutiveNumbers)*2 + SequentialLetters*3;

int sum = 0;

if (Bonus - Bonus2 < 0)

return 0;

return (Bonus - Bonus2) > 100?100:(Bonus - Bonus2);

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:C语言实现密码程序

C语言实现密码本

C语言实现密码本小项目

C语言编程中从密码文件获取数据的函数总结

C语言中操作密码文件的一些函数总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值