首页 > 其他分享 >仿射密码的加密和解密

仿射密码的加密和解密

时间:2023-11-15 22:46:31浏览次数:34  
标签:26 加密 String int 解密 密码 static 仿射

一、实验目的及要求

通过编程实现替代密码算法——仿射密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础

二、实验设备及要求

编译软件:idea

其他软件:captfencoder

三、实验内容与步骤

仿射密码的基本思想:加法密码和乘法密码结合就构成仿射密码,仿射密码的加密和解密算法是:

C=Ek(m)=(k1m+k2)mod nC=Ek(m)=(k1m+k2)mod n

M=Dk(c)=k1(c-k2)mod nM=Dk(c)=k1(c-k2)mod n o仿射密码具有可逆性的条件是gcd(k,n)=1。当k1=1时,仿射密码变为加法密码,

当k2=0时,仿射密码变为乘法密码。o仿射密码中的**空间的大小为np(n),当n为26字母,p(n)=12,因此仿射密码的**空间为12×26=312。

附源码:

import java.util.Scanner;

public class EncryAndDecry {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要加密的明文:");
        String s = scanner.next();
        String encryption = EncryAndDecry.encryption(s);
        System.out.println("加密后的密文为:" + encryption);
        String decrypt = EncryAndDecry.decrypt(encryption);
        System.out.println("解密后的明文为:" + decrypt);
        System.out.println("a:" + EncryAndDecry.getA() + "  b:" + EncryAndDecry.getB() + "  a逆:" + EncryAndDecry.reciprocal());
    }

    private static int a;
    private static int b;

    static {
        do {
            a = (int) (Math.random() * 26);
            b = (int) (Math.random() * 26);
        } while (a == 0 || b == 0 || gcd(26, a) != 1 || gcd(26, b) != 1);
    }

    public static int gcd(int a, int b) {
        if (b > a) {
            int c;
            c = a;
            a = b;
            b = c;
        }
        return a % b == 0 ? b : gcd(b, a % b);
    }

    public static int reciprocal() {
        int q = 1;
        for (int i = 3; i < 26; i = i + 2) {
            if ((a * i) % 26 == 1) {
                q = i;
                break;
            }
        }
        return q;
    }


    public static String encryption(String mingWen) {
        String s = "";
        char[] chars = mingWen.toCharArray();
        for (char aChar : chars) {
            int i = aChar;
            if (i >= 65 && i < 65 + 26) {
                String i1 = (char) ((a * (i - 65) + b) % 26 + 65) + "";
                s = s + i1;
            } else if (i >= 97 && i < 97 + 26) {
                String i1 = (char) ((a * (i - 97) + b) % 26 + 97) + "";
                s = s + i1;
            } else {
                continue;
            }

        }
        return s;
    }


    public static String decrypt(String miWen) {
        int reciprocal = reciprocal();
        String s = "";
        char[] chars = miWen.toCharArray();
        for (char aChar : chars) {
            int i = aChar;
            if (i >= 65 && i < 65 + 26) {
                int temp = (i - 65) - b;
                if (temp < 0) {
                    temp = temp + 26;
                }
                String i1 = (char) ((reciprocal * temp) % 26 + 65) + "";
                s = s + i1;
            } else if (i >= 97 && i < 97 + 26) {
                int temp = (i - 97) - b;
                if (temp < 0) {
                    temp = temp + 26;
                }
                String i1 = (char) ((reciprocal * temp) % 26 + 97) + "";
                s = s + i1;
            } else {
                continue;
            }

        }
        return s;
    }

    public static int getA() {
        return a;
    }

    public static int getB() {
        return b;
    }
}

四、实验结果与数据处理

 

五、实验分析与总结

在本次实验中我深刻的理解到仿射密码的加密解密过程,也对现代密码学有了初步的认识,在仿射密码中主要的的问题就是找到一个参数的逆元,密码和数字字母是分不开的,在以后的学习中我会抓住基础的练习,不断提高自己的能力。

 

标签:26,加密,String,int,解密,密码,static,仿射
From: https://www.cnblogs.com/ai5277/p/17835025.html

相关文章

  • 利用 kettle 对 oracle 实现字符串的脱敏和对称加密
    脱敏要求对身份证进行ASE加密处理对手机号只显示前三位和后四位其余使用****代替对于职业只显示前三个字对于真实姓名只显示展示一位即可kettle建立转换表输入表输出ASE加密选择组件密钥转换密钥必须是16进制且大于16个字节配置字段和加密算法......
  • SpringBoot 配置文件内容加密
    1.引入pom<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>......
  • 如何用SSH密钥实现加密和电子签名?
    SSH(SecureShell)密钥对可用于实现加密和数字签名,以确保数据的机密性和完整性。以下是使用SSH密钥进行加密和数字签名的基本步骤:1.生成SSH密钥对:在本地计算机上生成SSH密钥对,这包括私钥和公钥。使用以下命令生成:ssh-keygen-trsa-b2048这将生成一个2048位的RSA密钥对。您将被提......
  • C#.NET与JAVA加密解密
    C#.NET国密SM4对称加解密与JAVA互通  SM4加密算法Java和C#相互   Vive.Crypto......
  • Java非对称加密RSA算法
    简介:公开密钥密码学(英语:Public-keycryptography)也称非对称式密码学(英语:Asymmetriccryptography)是密码学的一种算法。加密与解密使用不同的密钥,其中一个称之为公钥,对外公开,通常用于数据加密。另一个称之为私钥,是不能对外公布的,通常用于数据解密,这样使用公钥加密的数据即使被......
  • 图解密码技术----读书笔记
    第1章环游密码世界术语加密encrypt明文plaintext密文ciphertext解密decrypt密码cryptography密码破译cryptanalysis破译,密码分析破译者cryptanalyst对称密码symmetriccryptography---->机密性公钥密码public-keycryptography<=>非对称密码asymmet......
  • DES对称加密算法Java实现
    DES对称加密算法Java实现源代码AESUtils.java//packageme.muphy.util;importjavax.crypto.*;importjavax.crypto.spec.SecretKeySpec;importjava.nio.charset.StandardCharsets;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmExcept......
  • 密钥分配和用户认证——基于对称加密的密钥分配
    基于对称加密的密钥分配(SymmetricKeyDistributionusingsymmetricencryption)对于对称加密,加密双方必须共享同一密钥,且必须保护密钥不被他人窃取需要频繁地改变密钥,以减少攻击者可能知道密钥所带来的数据泄露因此,任何密码系统的强度取决于密钥分配技术(密钥分发技术:传......
  • mysql 国密加密字段排序和模糊搜索
    双写加密字段和明文分别存到两个字段中,查询只对明文进行操作. (备注:这种只是应对检查或者设计的方式,对于程序没有实际意义)使用函数利用mysql已有加解密的函数,在排序和模糊搜索之前解密数据,再进行排序或者模糊搜索.(备注:查询速度受到很大影响,不能使......
  • Cocos Creator 「无侵入」资源加密方案
    前言CocosCreator打包后的素材资源,如:图片,声音等,默认是保持原始格式,只要遇到破解党,那么他们极有可能很简单就直接获取到这部分素材资源。针对这个问题,大部分同学都会有一种资源加密的需求,即对打包后的资源进行加密,让破解党不那么容易获取到资源。对啦!这里有个游戏开发交流小组......