首页 > 编程知识 正文

仿射密码及c 实现,实现凯撒密码加密功能

时间:2023-05-03 23:27:07 阅读:186220 作者:3787

仿射函数(affine )仿射函数是满足以下条件的函数

域有函数映射,c=ax b,其中a有逆元,也就是x有唯一的解。

一般来说,仿射函数是在有限的数域中定义的。 经典密码的仿射函数

c=(axb ) mod 26通常只考虑26个字母的英文字母。 其中,a满足与26的互素。

很明显,只有a和26是相互素的,根据xsdym定理

sa 26t=1

sc=(saxsb ) mod 26

sc=(xsb ) mod 26

x=(sc-sb ) mod 26

唯一x只是为了使解密唯一,不会产生歧义。

因此,在仿射加密中,加密函数可以是

c=(axb ) mod 26,c为密文,x为明文,a、b为参数,满足gcd(a,26 )=1

解码函数是

x=(sc-sb ) mod 26,其中sa=1 mod 26

根据情况,为了方便,可以将b设为0。 但是,这样的话钥匙的空间会变小。 因为和26互素的只有12个。

为了求出s,可能需要扩展的drjb算法,但因为这里的数字小,所以可以通过暴力检索来求出s。

C语言实现# includeiostreamusingnamespacestd; intfind_s(inta ) for ) intI=1; i26; I ) if(a*I&;==1) {返回I; }}stringencrypt(inta,int b,string message ) for ) intI=0; imessage.size (; I ) {message[i]-='a '; message[I]=(a*message[I]b ) &; message[i]='A '; }返回消息; }stringdecrypt(inta,int b,string cipher ) ints=find_s ) a; for(intI=0; icipher.size (; I ) {cipher[i]-='A '; cipher[I]=(s*cipher[I](26-s ) b ) &; //adding 26-sequals-s.cipher [ I ]=' a '; }return cipher; (}int main ) ) {int a=3,b=7; //the keystring m; 成本' pleaseenterthemessage : ' endl; cinm; 字符串c; c=encrypt(a,b,m ); cout'The ciphertext is 'cendl; m=decrypt(a,b,c ); cout'After decryption 'mendl; () ) ) ) )。

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