仿射函数(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; () ) ) ) )。