- 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 编写一个简单的加密程序。我的目标是将 abc(它可以是任何单词)翻译成 123。然后乘以 2 得到 246 然后再次翻译成文本,然后在屏幕上写 bdf。这是我的算法,它不能正常工作。
互联网上有很多关于加密的答案,但我一直无法找到我正在寻找的东西:使用 c# 提供的工具对字符串和文本文件进行加密的简单强加密。 我的主要问题是我不知道如何将 IV 保存到文本文件的开头或如何创建随机
C#“RSACryptoServiceProvider”加密算法是 Microsoft-CryptoAPI 的一部分吗? 通过在 .Net 中使用 CryptoAPI 而不是“RSACryptoSer
我正在编写适用于“流”的 XXTEA 加密算法的实现,即可以像这样使用:crypt mykey 输出。 其中一个先决条件是它根本无法访问文件(它只读取固定大小的 block ,直到找到 EOF)。该
嘿,这是我老师给我的一个加密例子。但是,我仍然搞不懂(Int)Message[i]是什么意思?那么程序在这条线上做什么呢?
嘿,这是我老师给我的一个加密例子。但是,我仍然搞不懂(Int)Message[i]是什么意思?那么程序在这条线上做什么呢?
嘿,我研究这个已经有一段时间了,我记得我的兄弟引导我完成了这个完全相同的算法。 基本上,它只是添加键中字符和短语的 ascii 值。 我可以用这个加密它: def encrypt(key, strin
我正在尝试将 BouncyCaSTLe 与 android 一起使用来实现 ECDH 和 EL Gamal。我已经添加了 bouncycaSTLe jar 文件 (bcprov-jdk16-144.j
我需要加密一个数字,我和这个加密的值将提供给客户询问 key ,所以我想尽量减少数字的数量并使它们都可以打印。 所以我希望结果要么全是数字,要么全是十六进制字符。 我正在使用的当前加密方法(对于非数字
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
我正在制作 note taking web app它会在您键入时连续保存笔记。我正在发送差异以防止通过线路发送过多数据,这在注释为纯文本时工作正常。 然而,我添加了对加密笔记的支持,所以笔记只会以加密
我正在寻找一种与 JavaScript 和 Java 兼容的安全对称 key 加密算法。 我已经尝试实现一个,但我遇到了一些编码问题。 最佳答案 您不想使用 JavaScript 加密,especia
目录 1 MD5 1.1 算法定义 1.2 MD5算法不安全的原因 1.2.1 字典表很大 1
在查看一些旧的 Coldfusion 代码时,我发现了几个通过加密/解密函数使用 CFMX_COMPAT 算法加密的数据实例。 找了一阵子,一直没找到这是什么算法。文档提到它现在是最不安全的方法,但我
谁能告诉我 iOS 上 SUP 用来加密底层数据库的加密算法是什么? 它是否依赖于 SQLite EE(加密扩展),如果是,使用了 4 种可用算法中的哪一种? 我的猜测是某种 AES,但官方文档中没有
我一直有这个问题。 The specified cryptographic algorithm is not supported on this platform. Exception Details
我正在为一个项目实现 3Des 加密算法。 我使用此代码作为示例: http://www.java2s.com/Code/Java/Security/TripleDES.htm 它工作正常,但我需要发
我正在尝试使用 adobe type 1 字体加密算法来加密文本文件。但是,我不知道如何用汇编语言正确地实现算法。如果可以,请帮助我。 下面是adobe type 1字体加密算法: unsigned
如何添加/创建具有特定加密算法的 c/c++ OpenSSL 静态库?假设我不想实现 md5。如何创建没有 md5 的库? 最佳答案 在配置脚本中你可以指定no-选项,它会在没有你指定的密码的情况下构
我检查了 TripleDES。它的 block 大小是 64 位。 有没有针对8位 block 大小的算法? 谢谢 编辑:我不打算将其用于完美保护,而是用于以防万一的情况,即看到代码的人不应该找到明文
我是一名优秀的程序员,十分优秀!