java - 带有/模运算的凯撒密码

标签 java encryption cryptography caesar-cipher

我这里有一个加法密码,可以强力测试固定密文的所有可能排列。它的功能很好,但我一生都无法弄清楚如何实现模运算和解密公式。 p = ((c - key) % 26) 其中 p 是明文值,c 是字母数组中的密文(即 A = 0、B=1 等)

这是代码

public class Problem1 {

public static void main(String[] args) {

String guess = "";

String ct = "UOISCXEWLOBDOX"; // ciphertext
    int key;// key to test
    char ch;
    for (key = 0; key < 26; key++) { // for each key value
        for (int i = 0; i < ct.length(); ++i) { // test char
            ch = ct.charAt(i);
            if (ch >= 'A' && ch <= 'Z') {
                ch = (char) (ch - key);
                if (ch < 'A') {
                    ch = (char) (ch + 'Z' - 'A' + 1);
                }
                guess += ch;
            } else {
                guess += ch;
            }
        }

        System.out.println("key: " + key + "     " + "Decrypted Message = " + guess);
        guess = "";
    }
}

}// main

这是模数算术的更新代码

import java.util.*;
import java.io.*;
`public class AdditiveCipher {

public static void main(String[] args)
{

    String guess = "";
    //char pt = 'a';
    String cipherText = "UOISCXEWLOBDOX";
    int key,i,x = 0;

    //array of characters we can use 
    char[] alphabet = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
            'P','Q','R','S','T','U','V','W','X','Y','Z'};

    //try each key on the cipher text
    for(key = 0; key < 26; key++)//for each key
    {
        for( i = 0; i < cipherText.length(); i++)//for each letter
        {
             int pt = (cipherText.charAt(i) - key - 'A') % 26;
             guess += (char)pt;
        }
        System.out.print(guess + "\n"); //display each guess
        guess = "";
    }//outer for
}//end main
}//end AdditiveCipher.java`

这是我在尝试了一段时间后的最新尝试,它输出了大量的盒子。任何逻辑方面的帮助将不胜感激,或者只是告诉我我做错了什么

最佳答案

这种模数解密方法的实现相当简单,并且完全按照您在问题中描述的方式完成。您所要做的就是按照您的描述创建字符数组 (A = 0, B = 1, ...),然后进行转换 p = ((c - key) %26) 对每个字符查找原文。至少,在理想世界中它是这样运作的。我敢打赌您遇到的麻烦是字符的 ASCII 值。如您所见here ,值'A'等于整数65,并且大写字母的值从那里开始增加。为了弥补这一点,请在执行模除法之前添加 13(或 'A',如 'A' % 26 = 13)(如下所示:p = ((c - key + 13) % 26)),你应该可以开始了。需要明确的是,p 是字符数组中存储该字符的原始文本值的位置,而不是解密字符的实际整数值。我希望这对您有所帮助,祝您实现顺利!

关于java - 带有/模运算的凯撒密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42405744/

相关文章:

Java 邮件 MimeUtility encodeText UnsupportedEncodingException BASE64

email - 请说明 SMTP 加密协议(protocol)和端口(仅限服务器之间)

c - 解决密码学问题,代码需要很长时间才能运行,需要对其进行优化

java - SWT在表单中动态绘制表格

java - hsql : how to execute script in a given path?

java - 列名称中包含 "é"的 iSeries JDBC Sql 语句抛出 java.sql.SQLException : [SQL0104]

hadoop - 找不到带有 key dfs.encryption.key.provider.uri 的 uri 以在 CDH 5.4 的 HDFS 加密中创建 key 提供程序

iphone - 如何解密 Objective C/IOS 中用 php 加密的文件?

web-applications - window.crypto.getRandomValues() 的兼容性

c++ - CryptDecrypt 在解密字符串的末尾返回随机字符?