密码加解密java语言实现

目录

前言

1.密码加密的主要方式

2.代码的实现过程

 3.整体代码


前言

        随着技术的发展,密码加密技术已经越来越普遍越来越多样化,在我们生活中常见的加密算法包括了DES加密算法,AES加密算法,RSA加密算法,MD5加密算法等等。密码加密在我们国家社会生活中都起着非常重要的作用,它能保护我们的重要信息不被泄露,维护国家安全,使个人和国家和社会的利益得到良好的保障,因此加密技术的可靠性也变得越来越重要。

1.密码加密的主要方式

        密码加解密简单的理解就是对字符串进行操作,通常我们的密码输入包括了大小写字母,数字,'.','_'字符,对于不同的字符可以通过产生随机数进行不同的处理,并将这些随机数与表达式相联系,通过某种方式来对随机数进行隐藏。此代码的大体处理过程对于大小写字母,先将大小写字母通过产生小于26位的随机数进行移位,比如当产生的随机数是7时,如果密码中有小写的字母a,则通过h来对a进行替代。这样就完成了第一步操作,为了更好的利用随机数再通过产生随机范围更大的随机数来对大小写字母进行移位,并将这些大小写字母移动到汉字所对应的ASCII上,以此步骤来对密码进行加密,而对随机数的处理,我们也可以通过相同的方式将随机数进行移位,而随机数移动的位数与大小写字母有一定的相关性,最后通过对不同的字符进行处理,就会得到通过随机数一位产生不同的汉字,并将这些汉字通过特定的方式组合在一起,最后就得到了密码加密的密钥了。对于密码解密过程,只需要进行反向逆推就可以得出。其中随机数可以大大的提高密钥的复杂程度,同一个密码通过加密可以得到不同的密钥。


2.代码的实现过程

 

 3.整体代码

package zuopin;
import java.util.Arrays;
import java.util.Scanner;
class Dengluxitong {
    //数字初始移动的位数
    private int Cshuziyidongweishu;
    //大写初始字母移动的位数
    private int Cdaxiezimuyidongdeweishu;
    //小写初始字母移动的位数
    private int Cxiaoxiezimuyidongdeweishu;
    //数字移动的位数
    private int shuziyidongweishu;
    //大写字母移动的位数
    private int daxiezimuyidongdeweishu;
    //小写字母移动的位数
    private int xiaoxiezimuyidongdeweishu;
    //密码
    private StringBuilder mima;
    //关键信息1代表大写字母2代表小写字母3代表数字4代表'.','_'
    private int []sss=new int[16];
    //重要信息1
    private char []zhongyaoxinxi1=new char[8];
    //未知数
    private char []weizhishu=new char[4];
    //设置初始密码
    Dengluxitong() {
        this.mima = new StringBuilder("################");
        this.Cshuziyidongweishu=(int)(1000000+Math.random()*20000);
        this.Cdaxiezimuyidongdeweishu=(int)(1000000+Math.random()*20000);
        this.Cxiaoxiezimuyidongdeweishu=(int)(1000000+Math.random()*20000);
        this.shuziyidongweishu=(int)(0+Math.random()*10);
        this.daxiezimuyidongdeweishu=(int)(0+Math.random()*26);
        this.xiaoxiezimuyidongdeweishu=(int)(0+Math.random()*26);
        zhongyaochuli1();
    }
    //返回数字初始移动的位数
    private int getCshuziyidongweishu() {
        return Cshuziyidongweishu;
    }
    //返回大写初始字母移动的位数
    private int getCdaxiezimuyidongdeweishu() {
        return Cdaxiezimuyidongdeweishu;
    }
    //返回小写初始字母移动的位数
    private int getCxiaoxiezimuyidongdeweishu() {
        return Cxiaoxiezimuyidongdeweishu;
    }
    //返回数字移动的位数
    private int getShuziyidongweishu() {
        return shuziyidongweishu;
    }
    //返回大写字母移动的位数
    private int getDaxiezimuyidongdeweishu() {
        return daxiezimuyidongdeweishu;
    }
    //返回小写字母移动的位数
    private int getXiaoxiezimuyidongdeweishu() {
        return xiaoxiezimuyidongdeweishu;
    }
    //返回关键信息
    private int[] getSss() {
        return sss;
    }
    private void zhongyaochuli1(){
        zhongyaoxinxi1[0]=(char)(1020005);
        zhongyaoxinxi1[1]=(char)(1020002);
        zhongyaoxinxi1[2]=(char)(1020000);
        zhongyaoxinxi1[3]=(char)(1020001);
        zhongyaoxinxi1[4]=(char)(1020003);
        zhongyaoxinxi1[5]=(char)(1020001);
        zhongyaoxinxi1[6]=(char)(1020004);
        zhongyaoxinxi1[7]=(char)(1020020);
        weizhishu[0]=(char) (1020189);
        weizhishu[1]=(char) (1020270);
        weizhishu[2]=(char) (1020361);
        weizhishu[3]=(char) (1020452);
    }
    //密码输入
    private void setMima() {
        Scanner input=new Scanner(System.in);
        System.out.println("提示:密码的位数为8~16位,且由大小写字母,数字,'.','_'组成。");
        System.out.println("请输入密码:");
        String A;
        int B;
        int C;
        do {
            C=0;
            do {
                A=input.next();
                if(A.length()<8)
                {
                    System.out.println("输入的密码位数太短!");
                    System.out.println("请重新输入:");
                }
                else
                if(A.length()>16)
                {
                    System.out.println("输入的密码位数太长!");
                    System.out.println("请重新输入:");
                }
            }while (A.length()<8||A.length()>16);
            for(int i=0;i<A.length();i++)
            {
                B=0;
                for(char j='0';j<='9';j++)
                {
                    if(A.charAt(i)==j)
                    {
                        B=1;
                        sss[i]=3;
                        break;
                    }
                }
                if(B==0)
                {
                    for(char j='A';j<='Z';j++)
                    {
                        if(A.charAt(i)==j)
                        {
                            B=1;
                            sss[i]=1;
                            break;
                        }
                    }
                }
                if(B==0)
                {
                    for(char j='a';j<='z';j++)
                    {
                        if(A.charAt(i)==j)
                        {
                            B=1;
                            sss[i]=2;
                            break;
                        }
                    }
                }
                if(B==0)
                {
                    if(A.charAt(i)=='.'||A.charAt(i)=='_')
                    {
                        B=1;
                        sss[i]=4;
                    }
                }
                if(B==0)
                {
                    System.out.println("输入的密码格式不对!");
                    System.out.println("请重新输入:");
                    break;
                }
                if(i==A.length()-1)
                {
                    C=1;
                }
            }
        }while (C!=1);
        mima= new StringBuilder(A);
    }
    //密码输出
    private StringBuilder getMima() {
        return mima;
    }
    //密码加密
    private void mimajiami(){
        int A=0;
        for(int i=0;i<mima.length();i++)
        {
            if(mima.charAt(i)=='#')
                A++;
        }
        if(A==16)
        {
            System.out.println("密码没有进行输入,无法进行加密!");
        }
        for(int i=0;i<mima.length();i++)
        {
            for(char j='A';j<='Z';j++)
            {
                if(mima.charAt(i)==j)
                {
                    culi1(i);
                    break;
                }
            }
            for(char j='a';j<='z';j++)
            {
                if(mima.charAt(i)==j)
                {
                    culi2(i);
                    break;
                }
            }
            for(char j='0';j<='9';j++)
            {
                if(mima.charAt(i)==j)
                {
                    culi3(i);
                    break;
                }
            }
            if(mima.charAt(i)=='.'||mima.charAt(i)=='_')
            {
                culi4(i);
            }
        }
    }
    //正向处理A~Z位的密码
    private void culi1(int i){
        char A;
        A=(char)(mima.charAt(i)+Cdaxiezimuyidongdeweishu);
        mima.setCharAt(i,A);
        if(mima.charAt(i)+daxiezimuyidongdeweishu>(char)(90+Cdaxiezimuyidongdeweishu))
        {
            A=(char)(mima.charAt(i)+daxiezimuyidongdeweishu-26);
            mima.setCharAt(i,A);
        }
        else
        {
            A=(char)(mima.charAt(i)+daxiezimuyidongdeweishu);
            mima.setCharAt(i,A);
        }
    }
    //正向处理a~z位的密码
    private void culi2(int i){
        char A;
        A=(char)(mima.charAt(i)+Cxiaoxiezimuyidongdeweishu);
        mima.setCharAt(i,A);
        if(mima.charAt(i)+xiaoxiezimuyidongdeweishu>(char)(122+Cxiaoxiezimuyidongdeweishu))
        {
            A=(char) (mima.charAt(i)+xiaoxiezimuyidongdeweishu-26);
            mima.setCharAt(i,A);
        }
        else
        {
            A=(char)(mima.charAt(i)+xiaoxiezimuyidongdeweishu);
            mima.setCharAt(i,A);
        }
    }
    //正向处理0~9位的密码
    private void culi3(int i) {
        char A;
        A=(char) (mima.charAt(i)+Cshuziyidongweishu);
        mima.setCharAt(i,A);
        if(mima.charAt(i)+shuziyidongweishu>(char)(57+Cshuziyidongweishu))
        {
            A=(char)(mima.charAt(i)+shuziyidongweishu-10);
            mima.setCharAt(i,A);
        }
        else
        {
            A=(char)(mima.charAt(i)+shuziyidongweishu);
            mima.setCharAt(i,A);
        }
    }
    //正向处理'.'和'_'
    private void culi4(int i){
        if(i%2==0)
        {
            if(mima.charAt(i)=='.')
            {
                mima.setCharAt(i,weizhishu[0]);
            }
            else
            {
                mima.setCharAt(i,weizhishu[1]);
            }
        }
        else
        {
            if(mima.charAt(i)=='.')
            {
                mima.setCharAt(i,weizhishu[2]);
            }
            else
            {
                mima.setCharAt(i,weizhishu[3]);
            }
        }
    }
    //密码解密
    private void mimajiemi(){
        for(int i=0;i<mima.length();i++)
        {
            culi5(i);
        }
    }
    //反向处理密码
    private void culi5(int i) {
        if(sss[i]==1)
        {
            char A;
            if(mima.charAt(i)-daxiezimuyidongdeweishu<(char)(65+Cdaxiezimuyidongdeweishu))
            {
                A=(char) (mima.charAt(i)-daxiezimuyidongdeweishu+26);
                mima.setCharAt(i,A);
            }
            else
            {
                A=(char)(mima.charAt(i)-daxiezimuyidongdeweishu);
                mima.setCharAt(i,A);
            }
            A=(char)(mima.charAt(i)-Cdaxiezimuyidongdeweishu);
            mima.setCharAt(i,A);
        }
        else
        if(sss[i]==2)
        {
            char A;
            if(mima.charAt(i)-xiaoxiezimuyidongdeweishu<(char)(97+Cxiaoxiezimuyidongdeweishu))
            {
                A=(char) (mima.charAt(i)-xiaoxiezimuyidongdeweishu+26);
                mima.setCharAt(i,A);
            }
            else
            {
                A=(char)(mima.charAt(i)-xiaoxiezimuyidongdeweishu);
                mima.setCharAt(i,A);
            }
            A=(char) (mima.charAt(i)-Cxiaoxiezimuyidongdeweishu);
            mima.setCharAt(i,A);
        }
        else
        if(sss[i]==3)
        {
            char A;
            if(mima.charAt(i)-shuziyidongweishu<(char)(48+Cshuziyidongweishu))
            {
                A=(char) (mima.charAt(i)-shuziyidongweishu+10);
                mima.setCharAt(i,A);
            }
            else
            {
                A=(char)(mima.charAt(i)-shuziyidongweishu);
                mima.setCharAt(i,A);
            }
            A=(char)(mima.charAt(i)-Cshuziyidongweishu);
            mima.setCharAt(i,A);
        }
        else
        {
            if(i%2==0)
            {
                if(mima.charAt(i)==weizhishu[0])
                {
                    mima.setCharAt(i,'.');
                }
                else
                {
                    mima.setCharAt(i,'_');
                }
            }
            else
            {
                if(mima.charAt(i)==weizhishu[2])
                {
                    mima.setCharAt(i,'.');
                }
                else
                {
                    mima.setCharAt(i,'_');
                }
            }
        }
    }
    //添加1
    private void tianjia1(StringBuilder B,int B1){
        B.append((char)B1);
    }
    //添加2
    private void tianjia2(StringBuilder B,int B1){
        B.append((char)(B1+1020200));
    }
    //总方法1
    void shuchumiyao() {
        Dengluxitong A=new Dengluxitong();
        A.setMima();
        A.mimajiami();
        StringBuilder B=A.getMima();
        int B1=A.getCshuziyidongweishu();
        int B2=A.getCdaxiezimuyidongdeweishu();
        int B3=A.getCxiaoxiezimuyidongdeweishu();
        int C1=A.getShuziyidongweishu();
        int C2=A.getDaxiezimuyidongdeweishu();
        int C3=A.getXiaoxiezimuyidongdeweishu();
        tianjia1(B,B1);
        tianjia1(B,B2);
        tianjia1(B,B3);
        tianjia2(B,C1);
        tianjia2(B,C2);
        tianjia2(B,C3);
        B.append(zhongyaoxinxi1[6]);
        int []C;
        C=A.getSss();
        char []D=new char[C.length];
        for(int i=0;i<D.length;i++)
        {
            if(C[i]==0)
            {
                D[i]=(char)(1020400);
            }
            else
            if(C[i]==1)
            {
                D[i]=(char)(1020403);
            }
            else
            if(C[i]==2)
            {
                D[i]=(char)(1020405);
            }
            else
            if(C[i]==3)
            {
                D[i]=(char)(1020407);
            }
            else
            {
                D[i]=(char)(1020409);
            }
        }
        B.append(D);
        String E=B.toString();
        System.out.println("输出的加密密码为:");
        for(int i=0;i<E.length();i++)
        {
            System.out.print(E.charAt(i));
        }
    }
    //总方法2
    void shucuyuanma(){
        Scanner input=new Scanner(System.in);
        xiaoxiezimuyidongdeweishu=0;
        daxiezimuyidongdeweishu=0;
        shuziyidongweishu=0;
        Cxiaoxiezimuyidongdeweishu=0;
        Cdaxiezimuyidongdeweishu=0;
        Cshuziyidongweishu=0;
        System.out.println();
        System.out.println("请输入加密密码:");
        String A=input.next();
        int B=15;
        int S;
        for(S=A.length()-1;S>=0;S--)
        {
            if(A.charAt(S)!=zhongyaoxinxi1[6])
            {
                if(A.charAt(S)==(char)(1020400))
                {
                    sss[B]=0;
                    B--;
                }
                else
                if(A.charAt(S)==(char)(1020403))
                {
                    sss[B]=1;
                    B--;
                }
                else
                if(A.charAt(S)==(char)(1020405))
                {
                    sss[B]=2;
                    B--;
                }
                else
                if(A.charAt(S)==(char)(1020407))
                {
                    sss[B]=3;
                    B--;
                }
                else
                if(A.charAt(S)==(char)(1020409))
                {
                    sss[B]=4;
                    B--;
                }
            }
            else
            {
                break;
            }
        }
        S--;
        xiaoxiezimuyidongdeweishu=A.charAt(S)-(char)1020200;
        S--;
        daxiezimuyidongdeweishu=A.charAt(S)-(char)1020200;
        S--;
        shuziyidongweishu=A.charAt(S)-(char)1020200;
        S--;
        Cxiaoxiezimuyidongdeweishu=A.charAt(S);
        S--;
        Cdaxiezimuyidongdeweishu=A.charAt(S);
        S--;
        Cshuziyidongweishu=A.charAt(S);
        int D=0;
        for(int i=0;i<16;i++)
        {
            if(sss[i]==0)
            {
                break;
            }
            else
            {
                D++;
            }
        }
        for(int i=D-1;i>=0;i--)
        {
            mima.setCharAt(i,A.charAt(i));
        }
        mimajiemi();
        for(int i=0;i<D;i++)
        {
            System.out.print(mima.charAt(i));
        }
    }
}

测试类

package helloworld;

class DengluxitongTest {
    public static void main(String[] args) {
        Dengluxitong A=new Dengluxitong();
        A.shuchumiyao();
        A.shucuyuanma();
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Playfair密码是一种古老的替换密码,使用一个5x5的矩阵来加密和解密文本。下面是Java语言实现Playfair密码加密解密示例代码: ```java public class PlayfairCipher { private char[][] keyMatrix; public PlayfairCipher(String key) { // 构造密钥矩阵 keyMatrix = new char[5][5]; String keyStr = key + "abcdefghiklmnopqrstuvwxyz"; keyStr = keyStr.replaceAll("j", "i"); int index = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { keyMatrix[i][j] = keyStr.charAt(index); index++; } } } public String encrypt(String plaintext) { // 对明文进行处理,去掉空格和非字母字符,并将j替换为i plaintext = plaintext.toLowerCase().replaceAll("[^a-z]", ""); plaintext = plaintext.replaceAll("j", "i"); StringBuilder ciphertext = new StringBuilder(plaintext); // 对明文进行分组,如果两个字母相同,在它们之间插入一个x for (int i = 0; i < ciphertext.length(); i += 2) { if (i == ciphertext.length() - 1) { ciphertext.append('x'); } else if (ciphertext.charAt(i) == ciphertext.charAt(i + 1)) { ciphertext.insert(i + 1, 'x'); } } // 处理分组后的明文,加密每一组 for (int i = 0; i < ciphertext.length(); i += 2) { char c1 = ciphertext.charAt(i); char c2 = ciphertext.charAt(i + 1); int[] pos1 = findPosition(c1); int[] pos2 = findPosition(c2); if (pos1[0] == pos2[0]) { // 在同一行 ciphertext.setCharAt(i, keyMatrix[pos1[0]][(pos1[1] + 1) % 5]); ciphertext.setCharAt(i + 1, keyMatrix[pos2[0]][(pos2[1] + 1) % 5]); } else if (pos1[1] == pos2[1]) { // 在同一列 ciphertext.setCharAt(i, keyMatrix[(pos1[0] + 1) % 5][pos1[1]]); ciphertext.setCharAt(i + 1, keyMatrix[(pos2[0] + 1) % 5][pos2[1]]); } else { // 不在同一行也不在同一列 ciphertext.setCharAt(i, keyMatrix[pos1[0]][pos2[1]]); ciphertext.setCharAt(i + 1, keyMatrix[pos2[0]][pos1[1]]); } } return ciphertext.toString(); } public String decrypt(String ciphertext) { // 对密文进行处理,去掉空格和非字母字符,并将j替换为i ciphertext = ciphertext.toLowerCase().replaceAll("[^a-z]", ""); ciphertext = ciphertext.replaceAll("j", "i"); StringBuilder plaintext = new StringBuilder(ciphertext); // 处理密文,解密每一组 for (int i = 0; i < plaintext.length(); i += 2) { char c1 = plaintext.charAt(i); char c2 = plaintext.charAt(i + 1); int[] pos1 = findPosition(c1); int[] pos2 = findPosition(c2); if (pos1[0] == pos2[0]) { // 在同一行 plaintext.setCharAt(i, keyMatrix[pos1[0]][(pos1[1] + 4) % 5]); plaintext.setCharAt(i + 1, keyMatrix[pos2[0]][(pos2[1] + 4) % 5]); } else if (pos1[1] == pos2[1]) { // 在同一列 plaintext.setCharAt(i, keyMatrix[(pos1[0] + 4) % 5][pos1[1]]); plaintext.setCharAt(i + 1, keyMatrix[(pos2[0] + 4) % 5][pos2[1]]); } else { // 不在同一行也不在同一列 plaintext.setCharAt(i, keyMatrix[pos1[0]][pos2[1]]); plaintext.setCharAt(i + 1, keyMatrix[pos2[0]][pos1[1]]); } } return plaintext.toString(); } private int[] findPosition(char c) { // 查找字符在密钥矩阵中的位置 int[] pos = new int[2]; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (keyMatrix[i][j] == c) { pos[0] = i; pos[1] = j; return pos; } } } return pos; } } ``` 使用示例: ```java PlayfairCipher cipher = new PlayfairCipher("playfair example"); String plaintext = "hello world"; String ciphertext = cipher.encrypt(plaintext); String decryptedText = cipher.decrypt(ciphertext); System.out.println("Plaintext: " + plaintext); System.out.println("Ciphertext: " + ciphertext); System.out.println("Decrypted text: " + decryptedText); ``` 输出: ``` Plaintext: hello world Ciphertext: axeevythvtah Decrypted text: helloworldx ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡闹的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值