首页 > 编程知识 正文

博密码暴力破解,暴力指南破解密码

时间:2023-05-05 13:06:19 阅读:186231 作者:1155

仿射密码是单表置换密码,是加法密码和乘法密码的组合。

加密函数e(x )=AXB (mod 26 ),要求gcd(a,26 )=1

函数x=a^(-1 ) (e ) x )-b ) ) ) )

加密代码如下所示。

# include iostream # include string.husingnamespacestd; char m[100]; char c[100]; intgcd(inta,int b )//辗转相除得到a、b的最大公约数({int k=0; do{k=a%b; a=b; b=k; }while(k!=0; return a; (int b )求出对于int b,int b )/b的a的逆矩阵) {int i=0; while(a* ) I ) %b!=1; //a*i=1 mod breturn i; }voidJiami(charm )、int k1、int k2 ) /加密) intlen=Strlen(m ); for(intI=0; ilen; I ) c(I )=(K1* ) m ) I )-97 ) k2 ) &; 65; //加密格式e(x )=k1*xk2 ) mod26 ) }cout )加密的密文由(); for(intI=0; ilen; I ) coutc[i]; coutendl; }voidjiemi(charc ((,int k1,int k2 )//解密) intlen=strlen ) c; char mm[100]; for(intI=0; ilen; I ) {int t=c[i]-65-k2; if(T0 ) t=26; mm[i]=k1*t&; 97; //解码公式x=k1^-1*(e(x )-k2 ) mod26 ) }cout )解码后的明文为'; for(intI=0; ilen; I ) coutmm[i]; coutendl; (}int main ) ) {char m[100]; int k1、k2; 输入cout '明文: '; cinm; cout '键k1和k2:'; cink1k2; while(gcd ) k1,26 )!=1//判断输入的密钥是否合法{ cout输入的密钥不正确。 请再输入一次!' endl; cink1k2; (Jiami ) m、k1、k2); int k3=ni (k1,26 ); cout '解密密钥是'; coutk3' 'k2endl; JIEMI(C,k3,k2 ); 返回0; }对于仿射加密,加密函数有两个参数a和b,由于a要求26相互素,所以只有12个选择,由于b的选择有26种,所以密钥空间的大小只有12*26=312。 计算量不是很多。 暴力解读的时候,直接网罗起来寻找有意义的字符串就可以了。

代码如下所示。

# include iostream # include fstream # include string.husingnamespacestd; intl [ ]={ 9,21,15,3,19,7,23,11,5,17,25 }; intr [ ]={ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 char m[100]; voidjiemi(charc )、int k1、int k2 ) /解密(intlen=Strlen ) c ); for(intI=0; ilen; I ) {int t=c[i]-65-k2; if(T0 ) t=26; m[i]=k1*t&; 97; //解码表达式x=k1^-1*(e(x )-k2 ) ) mod26 ) }ofstream outfile,fout; outfile.open('file.txt ',ios:app ); for(intI=0; ilen; I ) outfilem[i]; 输出文件结束; }int main () {cout请输入要解密的密文。 ); cinc; for(intI=0; i11; I ) for(intj=0; j25; j ) jiemi(c,l[i],r[j]; }return 0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。