- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为自定义加密和解密算法做了一个小脚本,它基于凯撒密码和转录密码。
首先有一点背景来解释它应该如何工作。假设您要在发送前加密一条消息。您对其应用凯撒密码,即将字母表中的每个字母向右移动 3 个位置。然后,您获取该加密文本并按您的 key 具有的字母数将其划分为多个部分。假设您的消息有 n
字母,你的 key 有m
字母。那么你的消息应该被分解为n/m
m
中的每一个部分(四舍五入或天花板)字母。如果消息长度不能被 key 中的字母数整除,则必须用字母 A
填充缺失的字母.然后由键给出,您根据字母表中与列号对应的特定键字母的位置转置列。因此,如果您的 key 是 LEAK
,则必须根据以下位置对列进行转置:3241
, 因为 1234
对应于 AEKL
(按字母顺序排序)。然后这个转置矩阵被连接回相应的字符串,然后可以发送。解密基本上是按顺序颠倒的相同过程→您收到一条消息,并且您知道 key 。您将其打包成列,然后转置列以对应于 key 中字母的字母顺序,将其连接回来,然后运行反向凯撒密码(将字母在字母表中向左移动 3 个位置)。你可能会得到一些 X
最后的字母,这实际上并不重要。
现在我的问题是:我为它写了一个小的 Javascript 程序,它实际上是一个模块,我也有一个测试脚本来看看它是如何工作的。但它不能正确工作。换位错误,导致破译文本格式错误。我知道解密的文本,因为我在编写脚本之前手动完成了这个算法,并且我知道它应该有的结果。
这是模块:
module.exports = {
decrypt: (message, key) => {
if(message.length % key.length != 0) {
throw new Error(`Lenght of message is not divisible by lenght of the key! ${message.length} is not divisible by ${key.length}!`);
}
let key_array_unsorted = key.split('');
let key_array_sorted = key.split('').sort();
let message_matrix = [];
for(i = 0; i < message.length / key.length; ++i) {
let quartet = [];
for(j = 0; j < key.length; ++j) {
quartet.push(message.charAt(i*key.length + j));
}
message_matrix.push(quartet);
}
let message_matrix_shuffled = [];
message_matrix.forEach(quartet => {
let quartet_shuffled = [];
for(i = 0; i < key.length; ++i) {
for(j = 0; j < key.length; ++j) {
if(key_array_unsorted[i] == key_array_sorted[j]) {
quartet_shuffled.push(quartet[j]);
}
}
}
message_matrix_shuffled.push(quartet_shuffled);
});
let message_quartets = [];
message_matrix_shuffled.forEach(quartet => {message_quartets.push(quartet.join(''))});
let message_caesar = message_quartets.join('');
let message_deciphered = "";
for(i = 0; i < message_caesar.length; ++i) {
let charcode = message_caesar.charCodeAt(i);
let alphanum = charcode - 65;
let alphanum_new = (alphanum + 23) % 26;
let charcode_new = alphanum_new + 65;
message_deciphered += String.fromCharCode(charcode_new);
}
return message_deciphered;
},
encrypt: (message, key) => {
let message_caesar = "";
for(i = 0; i < message.length; ++i) {
let charcode = message.charCodeAt(i);
let alphanum = charcode - 65;
let alphanum_new = (alphanum + 3) % 26;
let charcode_new = alphanum_new + 65;
message_caesar += String.fromCharCode(charcode_new);
}
for(i = 0; i <= Math.ceil(message_caesar.length / key.length) * key.length - message_caesar.length; ++i) {
message_caesar += "A";
}
let key_array_unsorted = key.split('');
let key_array_sorted = key.split('').sort();
let message_matrix = [];
for(i = 0; i < message_caesar.length / key.length; ++i) {
let quartet = [];
for(j = 0; j < key.length; ++j) {
quartet.push(message_caesar.charAt(i*key.length + j));
}
message_matrix.push(quartet);
}
let message_matrix_shuffled = [];
message_matrix.forEach(quartet => {
let quartet_shuffled = [];
for(i = 0; i < key.length; ++i) {
for(j = 0; j < key.length; ++j) {
if(key_array_sorted[i] == key_array_unsorted[j]) {
quartet_shuffled.push(quartet[j]);
}
}
}
message_matrix_shuffled.push(quartet_shuffled);
});
let message_quartets = [];
message_matrix_shuffled.forEach(quartet => {message_quartets.push(quartet.join(''))});
let message_ciphered = message_quartets.join('');
return message_ciphered;
}
}
这是测试脚本:
const cipher = require('./cipher');
let message = "HGYRDGQCREGLDYQROXRHABAK";
let key = "OMYL";
console.log(`Received message: ${message}`);
console.log(`Known passphrase: ${key}`);
let message_deciphered = cipher.decrypt(message, key);
console.log(`Deciphered message: ${message_deciphered}`);
let message_encrypted = cipher.encrypt(message_deciphered, key);
console.log(`Control encryption: ${message_encrypted}`);
模块和测试脚本在同一个文件夹中。
Received message: HGYRDGQCREGLDYQROXRHABAK
Known passphrase: OMYL
Deciphered message: ODEVZDANIBODOVANEULOHYXX
Control encryption: HGYRDGQCREGLDYQROXRHABAK
这是当前输出:
Received message: HGYRDGQCREGLDYQROXRHABAK
Known passphrase: OMYL
Deciphered message: VDOENDZADBIONVOAOUELXYHX
Control encryption: HGYRDGQCREGLDYQROXRHABAK
现在,我确定 key 的字母排序正确,这不是导致错误转录的原因,我实际上查找了正确排序的 key 字母,没关系。
OMYL
实际上确实正确排序到
LMOY
.
最佳答案
根据聊天中OP给出的算法,码字排序错误
将已排序序列与未排序序列进行比较,而不是其他方式
替换 key_array_unsorted[i] == key_array_sorted[j]
与 key_array_sorted[i] == key_array_unsorted[j]
关于javascript - 解密和加密算法很时髦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65129102/
我有一个 C# 应用程序调用 Java 网络服务来验证用户密码。我想让 C# 应用程序加密密码,然后让 Java Web 服务解密密码。我已经完成了 Java 端的代码(解密代码),但我无法找出 C#
我正在使用以下代码在使用 openssl 的 Windows 中使用 C 加密和解密二进制数据。如您所见,在这两个函数中,我都知道纯文本的大小。有什么方法可以在不知道纯文本大小的情况下解密消息? #i
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一个非常恼人的问题,Java中使用RSA算法对字符串进行不可靠的加密和解密。它似乎只能在大约 35% 的时间内工作,而且我不明白为什么它有时能工作,有时却不能。这是我写的一些测试代码,试图验证加密
我已经设法编写了用于文件加密/解密的函数。但它非常慢,尤其是随着文件大小的增加。例如几MB长的音频/视频文件 我几乎浏览了所有帖子来改进它,并尝试更改算法。如果有任何更改可以帮助我提高性能,请帮助我。
我正在尝试让我的转置密码发挥作用。 每当我将加密方法得到的密文输入解密方法时,我应该得到原始的明文......但事实并非如此...... 我做错了什么? 感谢您的帮助! public String E
我正在使用密码来加密和解密消息: public String encrypt(String string) throws InvalidKeyException, IllegalBlockSizeEx
我有一个在 MySQL 中存储数据的 spring-mvc 堆栈。其中一些数据需要保护,所以我想我应该加密它。由于我以后可能需要使用这些数据(信用卡、SSN 等),所以我需要对其进行解密。我认为这排除
作为一名SEOER,都想了解百度算法,通过算法原理来找到捷径的优化方案,那么今天我把研究多年的百度算法原理解密给大家,可能不是最好的,但是我可以给大家保证,这些都是非常实际的。希望给SEOER带来一
我试图找到一种技术来加密和解密程序中的文件,而无需将密码硬编码到程序中,也无需向用户询问密码。 如果我也可以从我正在编写的另一个程序中解密文件,那就太好了。 到目前为止,我还没有多少运气找到一种看起来
有没有一种方法可以使用作为字符串参数传递给程序的私钥而不是使用存储在机器上的证书来解密 PowerShell 中的 RSA?欢迎任何帮助,我的代码如下。 Function Decrypt-Asymme
通过问题Is it possible to use the Grails Jasypt plugin outside the GORM layer for simple String encrypti
我需要解密/加密我的域类中的几列,并且正在寻找有关如何做的信息。我已经找到了jasypt加密插件,但不幸的是它似乎与Grails 2.4不兼容。 我可能可以将一些东西拼凑在一起,但是想要确保Im遵循最
我需要有关声音文件加密/解密的帮助。我想在存储这个声音文件时加密一个声音文件,并在播放这个文件时解密它。我阅读了有关 java 中的加密/解密以及 java 中可用于此的大量示例代码。但这些程序不适用
我很感兴趣是否可以使用 Excel Visual Basic 和某些加密服务提供程序进行字符串加密/解密。 我找到了一个演练 Encrypting and Decrypting Strings in
我们正在使用加密/解密和UIIMAGE。如果我们在不保存到iphone画廊的情况下进行加密和解密以及UIIMAge,则可以正常工作,但是,如果我们进行加密,保存到画廊,将(加密的图像)加载到应用程序中
我正在做一个像这样的简单程序: package rsaexample; import java.io.*; import java.math.BigInteger; import java.secur
我发现这段代码返回给定字符串的校验和。 public static String getChecksum(String md5) { int counter = 0; while (c
我在 Java SE 和 Android 项目上使用相同的代码。在 Java 和 Android 中运行的应用程序连接到相同的 MQTT 代理并交换消息。消息使用 AES 进行加密/解密。我对 Jav
我想在 openssl/libcrypto 中使用 RSA 加密/解密一个长文件(我知道 AES 更好,但这只是为了比较)。我将输入文件分成大小为 numBlocks = inputFileLengt
我是一名优秀的程序员,十分优秀!