java实现滚动密钥密码

滚动密钥密码

对于周期代换密码,当密钥的长度d和明文一样长时,就成为滚动密钥密码。

具体可见如下表所示:

明文meetatnineintheevening
密钥beijingmeetatnineinthe
密文NIMCIGTURIBNMUMRZMABUK

java代码实现如下:

package com.ibianma;

/**
 * 滚动密钥密码
 */
public class ScrollPassword {
    /**
     * 加密算法
     * @param plaintext 明文
     * @param chars 密钥
     * @return 密文
     */
    public String encryption(String plaintext,char[][] chars){
        String ciphertext = "";
        char[] charArray = plaintext.toCharArray();
        for (int i = 0; i <charArray.length ; i++) {
            int j = charArray[i];
            if (j>=97&&j<=97+26){
                int k = chars[1][i];
                char te = (char) (((j - 97) + (k - 65)) % 26+65);
                ciphertext = ciphertext+te;
            }
            if (j>=65&&j<=65+26){
                int k = chars[1][i];
                char te = (char) (((j - 65) + (k - 65)) % 26+97);
                ciphertext = ciphertext+te;
            }
        }
        return ciphertext;
    }

    /**
     * 解密算法
     * @param ciphertext 密文
     * @param chars 密钥
     * @return 明文
     */
    public String decrypt(String ciphertext,char[][] chars){
        String plaintext="";
        char[] charArray = ciphertext.toCharArray();
        for (int i = 0; i <charArray.length ; i++) {
            int j = charArray[i];
            if (j>=97&&j<=97+26){
                int k = chars[1][i];
                char te = (char) (((j - 97) + 26-(k - 65)) % 26+65);
                plaintext = plaintext+te;
            }
            if (j>=65&&j<=65+26){
                int k = chars[1][i];
                char te = (char) (((j - 65) + 26-(k - 65)) % 26+97);
                plaintext = plaintext+te;
            }
        }
        return plaintext;
    }

    /**
     * 获取密钥表
     * @param plaintext 明文
     * @param secretKey 密钥
     * @return 密钥
     */
    public char[][] getSecretKey(String plaintext,String secretKey){
        char[][] chars = new char[2][plaintext.length()];
        for (int i = 0; i <plaintext.length() ; i++) {
            chars[0][i]=plaintext.charAt(i);
            if (i<secretKey.length()) {
                chars[1][i] = secretKey.toUpperCase().charAt(i);
            }else {
                chars[1][i] = plaintext.charAt(i - secretKey.length());
            }
        }
        return chars;
    }
}

测试代码如下:

package com.ibianma;

import java.util.Scanner;

public class CodingTest {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入密匙:");
        String s = scanner.next();
        ScrollPassword mima = new ScrollPassword();
        System.out.print("请输入明文:");
        String mingWen = scanner.next();
        char[][] secretKey = mima.getSecretKey(mingWen, s);
        System.out.println("密钥如下:");
        for (int i = 0; i <2 ; i++) {
            for (int j = 0; j <secretKey[0].length ; j++) {
                System.out.print(secretKey[i][j]+" ");
            }
            System.out.println();
        }
        String sl = mima.encryption(mingWen,secretKey);
        System.out.println("加密后的密文是:"+sl);
        String s2 = mima.decrypt(sl,secretKey);
        System.out.println("解密后的明文是:"+s2);
    }
}

测试结果如下:

请输入密匙:dfghn
请输入明文:dfvghndfgdgnj
密钥如下:
d f v g h n d f g d g n j 
D F G H N d f v g h n d f 
加密后的密文是:GKBNUWOGSQZWU
解密后的明文是:dfvghndLgdgnj

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DH(Diffie-Hellman)交换是一种非对称加算法,可以实现在不安全的通信信道上安全地交换。下面是使用Java语言实现DH交换的示例代码: ``` import javax.crypto.KeyAgreement; import javax.crypto.interfaces.DHPrivateKey; import javax.crypto.interfaces.DHPublicKey; import javax.crypto.spec.DHParameterSpec; import javax.crypto.spec.DHPrivateKeySpec; import javax.crypto.spec.DHPublicKeySpec; import java.math.BigInteger; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.spec.InvalidKeySpecException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; public class DHKeyExchange { public static void main(String[] args) { try { // 生成DH对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DH"); keyPairGenerator.initialize(512); // 设置长度 KeyPair keyPair = keyPairGenerator.generateKeyPair(); DHPublicKey publicKey = (DHPublicKey) keyPair.getPublic(); DHPrivateKey privateKey = (DHPrivateKey) keyPair.getPrivate(); // 生成DH参数 DHParameterSpec dhParameterSpec = publicKey.getParams(); BigInteger g = dhParameterSpec.getG(); BigInteger p = dhParameterSpec.getP(); // 将公和参数发送给对方 byte[] publicKeyBytes = publicKey.getEncoded(); byte[] pBytes = p.toByteArray(); byte[] gBytes = g.toByteArray(); // 对方接收到公和参数后进行协商 DHPublicKey receivedPublicKey = generatePublicKey(publicKeyBytes, dhParameterSpec); KeyAgreement keyAgreement = KeyAgreement.getInstance("DH"); keyAgreement.init(privateKey); keyAgreement.doPhase(receivedPublicKey, true); byte[] sharedSecret = keyAgreement.generateSecret(); System.out.println("共享:" + new String(sharedSecret)); } catch (NoSuchAlgorithmException | InvalidKeySpecException | InvalidKeyException e) { e.printStackTrace(); } } private static DHPublicKey generatePublicKey(byte[] publicKeyBytes, DHParameterSpec dhParameterSpec) throws InvalidKeySpecException { BigInteger y = new BigInteger(1, publicKeyBytes); DHPublicKeySpec keySpec = new DHPublicKeySpec(y, dhParameterSpec.getP(), dhParameterSpec.getG()); return (DHPublicKey) KeyFactory.getInstance("DH").generatePublic(keySpec); } } ``` 这段代码生成了一个512位长的DH对,并将公和参数发送给对方,对方接收到公和参数后进行协商,最终生成共享

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值