- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我这里有一个加法密码,可以强力测试固定密文的所有可能排列。它的功能很好,但我一生都无法弄清楚如何实现模运算和解密公式。 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/
是否有更快的算法来计算 (n! modulo m)。在每个乘法步骤都比减少更快。并且有没有比左右二元法更快的算法来计算 (a^p modulo m)。 这是我的代码:n!模数m ans=1 for(i
我有非常简单的代码循环遍历数组中的元素并检查是否index % 2 == 0。如果是这样,它应该改变颜色。 var e = document.getElementById("list").childN
让我简短一点。我正在计算 alert((Math.pow(7,35))%71) 但它给了我 61,而结果必须是 70。怎么了? 最佳答案 正如其他人之前提到的关于使用 Math.pow(7,35) 的
我试图弄清楚如何在汇编中计算模 10,所以我在 gcc 中编译了以下 c 代码,看看它想出了什么。 unsigned int i=999; unsigned int j=i%10; 令我惊讶的是我得到
例如使用以下输入: int num = -100 int divisor = 10 => -100 mod 10 = 0 (Edge-case: negative numbers as inpu
这个问题在这里已经有了答案: Random float number generation (14 个答案) 关闭 9 年前。 在 C++ 中,我希望得到一个随机 float 。据我所知,典型的随机
我试图找到潜在阶乘素数的除数(n!+-1 形式的数),因为我最近购买了 Skylake-X 工作站,我认为我可以使用 AVX512 指令提高一些速度。 算法简单,主要步骤是对同一个除数重复取模。主要是
我有一个保存角度(以度为单位)的变量,该角度可以是正值也可以是负值。我现在需要确保该数字仅在 0 到 360 之间。该数字是 double 。 执行此操作的好算法是什么?简单地执行角度 % 360 是
我有一个 UInt8 数组,我想计算 CheckSum8 模 256。如果字节总和小于 255,checkSum 函数返回正确的值。 例如 let bytes1 : [UInt8] = [1, 0xa
使用海湾合作委员会: printf("%i \n", -1 % (int)4); printf("%u \n", -1 % (unsigned int)4); 输出: -1 3 我可以跨平台依赖这种行
我无法理解代码中几行的含义。我最近开始学习 C++,并阅读了 Bjarne Stroustrup 的“编程:使用 C++ 的原理和实践”。第四章有个问题让我很困惑,所以我在网上搜索了一个解决方案以供引
我试图解决一个涉及大阶乘模质数的问题,并在另一个人的解决方案中发现了以下算法: long long factMod (long long n, long long p) { long long
我正在尝试计算 𝐹𝑛 模 𝑚,其中 𝑛 可能非常大:高达 10^18,𝐹𝑛 是第 n 个斐波那契数这是我的代码,它适用于小数字,但对于大数字,它会抛出 OutOfMemoryError 或
我有两个以 16 为模的循环整数,因此它们的值介于 0 和 15 之间。 我需要比较两个数字以确定 n_1 是否大于 n_0 n_1 > n_0 很明显,这个没有准确定义,所以我定义n_1如果小于前面
我一直在尝试使用 Java 处理一些更大的值,但遇到了一些我不理解的问题。出于某种原因,Java 似乎喜欢给我垃圾数据(尽管,我更可能告诉它给我垃圾数据) 这是一个片段,为清楚起见进行了编辑:
好吧,我今天做了一个小函数,它应该会生成一个随机字符串。 std::string randString(size_t length) { std::string randStr; fo
Ruby 的负数取模规则不明确。在 IRB 中: -7 % 3 == 2 应该是1!为什么? 最佳答案 因为 -7/3 在 Ruby 的整数除法语义下是 -3。 3*-3 是 -9,所以会留下 2
这个问题在这里已经有了答案: Calculating pow(a,b) mod n (14 个答案) 关闭 6 年前。 在 Javascript 中是否有获取大数模数的技巧。我用 modulo(7,
此代码使用公式 (a^x) % 101 检查值 a 是否唯一映射到值 1 到 100 local function f(a) found = {} bijective = true
在《Core Java Volume1》一书中有一条警告: CAUTION: The right-hand side argument of the shift operators is reduce
我是一名优秀的程序员,十分优秀!