安恒11月赛Crypto 仿射

一、放射密码简介

安恒11月赛Crypto 仿射_第1张图片

仿射变换的加密解密分别是:


c = Ea,b(m) ≡ a, + b(mod 26)
m = Da,b(c) ≡ a^-1(c - b)(mod 26)
其中,a,b是密钥,为满足0≤a,b≤25gcd(a,26)等于1的整数。

其中gcd(a,26)表示a和26的最大公因子,gcd(a,26)=1表示a和26是互素的,a^-1表示a的逆元,即a^-1*a ≡ 1mod26

解析:

加密过程较为容易

加密算法:c = a*m + b(mod n)加密过程:1,获取a,b,n;(若未知)2,获取明文字符串;3,1,将每一个明文字符转换成对应的数字;2,将明文数字带入公式c = a*m + b(mod n),获取密文对应数字;3,将密文数字转换成对应的密文字符。

解密过程是是其中难点。

解密算法:m = a^-1(m - b) (mod n)(注:a^用_a表示)

解密过程:

1, 获取a, b,n;(若未知)2,获取密文字符串;(若未知)31,设置数组coprime为存放与n互素的元素2,获取value1,value2的最大公约数3,在coprime中寻找a的模n可逆元_a4, 1,将每一个
密文字符转换成对应的数字;2,将密文数字带入公式m = a^-1(m - b) (mod n),获取明文对应数字;3,将明文数字转换成对应的明文字符。
另一篇较好的文章:点我
放射密码加解密过程:(Java实现)

package com.jiangbiao.firsthomework;

import java.util.Scanner;

/**
 * 仿射密码的加密和解密
 * n = 26
 */
public class AffineCipher {

    //n
    public static final int n = 26;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入密钥k1:");
        int k1 = input.nextInt();
        System.out.println("请输入密钥k2:");
        int k2 = input.nextInt();

        Scanner input2 = new Scanner(System.in);
        System.out.println("请输入明文:");
        String express = input2.nextLine();

        //加密
        String ciphertext;
        ciphertext = encryptionOperation(k1, k2, express);
        System.out.println("密文:" + ciphertext);

        //解密
        String decrypttext = Decrypt(k1, k2, ciphertext);
        System.out.println("解密结果:" + decrypttext);

    }

    /**
     * 加密:C= Ek(m)=(k1m+k2) mod n
     * @param k1
     * @param k2
     * @param express
     * @return
     */
    public static String encryptionOperation(int k1, int k2, String express){
        //转化成小写并去除空格
        String express2 = express.toLowerCase().replaceAll(" ", "");
        System.out.println("express2:" + express2);
        char[] expressChar = express2.toCharArray();
        int[] jiamiChar = new int[express2.length()];
        //将字母转换成数字表示
        for (int i=0;i

二、例子

给出两个文件:

安恒11月赛Crypto 仿射_第2张图片

提示放射密码,但是只给了一个b,a不知道,但是根据放射密码的定义,gcd(a,26)=1表示a和26是互素的,所以可以缩小范围,跟26互素的数没几个,列出来,都尝试一下:
a=[3,5, 7, 9, 11 ,15 , 17 , 19 ,21 ,23, 25]#与26互质的数
b=7
m=26
ch=”achjbnpdfherebjsw”
for i in a:
for j in range(len(ch)):

    if ord(ch[j]) >= 65 and ord(ch[j]) <= 90:
            r =((i * ((ord(ch[j])-65) - b)) % m + 65);
            print(chr(r),end='')
    elif(ord(ch[j]) >= 97 and ord(ch[j]) <= 122):
            r = ((i * ((ord(ch[j])-97) - b)) % m + 97);
            print(chr(r),end='')

    else:
            print(ch[j],end='')
print()

输出结果:

安恒11月赛Crypto 仿射_第3张图片

你的支持是我最大的动力!

支付宝
微信

你可能感兴趣的:(安恒11月赛Crypto 仿射)