crypto-keygen-suite
Version:
Key generation utilities for cryptographic operations. YES I RENAMED IT. SIX STATE PROTOCOL!!! See its folder for all <3
88 lines (72 loc) • 2.67 kB
JavaScript
import yargs from 'yargs/yargs';
import { hideBin } from 'yargs/helpers';
function columnarTranspositionEncrypt(message, key) {
const numColumns = key.length;
const numRows = Math.ceil(message.length / numColumns);
const grid = Array.from({ length: numRows }, () => Array(numColumns).fill(''));
for (let i = 0; i < message.length; i++) {
const row = Math.floor(i / numColumns);
const col = i % numColumns;
grid[row][col] = message[i];
}
const keyOrder = Array.from(key).map((char, index) => ({ char, index }))
.sort((a, b) => a.char.localeCompare(b.char))
.map(item => item.index);
let result = '';
for (const col of keyOrder) {
for (let row = 0; row < numRows; row++) {
if (grid[row][col]) {
result += grid[row][col];
}
}
}
return result;
}
function columnarTranspositionDecrypt(message, key) {
const numColumns = key.length;
const numRows = Math.ceil(message.length / numColumns);
const grid = Array.from({ length: numRows }, () => Array(numColumns).fill(''));
const keyOrder = Array.from(key).map((char, index) => ({ char, index }))
.sort((a, b) => a.char.localeCompare(b.char))
.map(item => item.index);
let index = 0;
for (const col of keyOrder) {
for (let row = 0; row < numRows; row++) {
if (index < message.length) {
grid[row][col] = message[index++];
}
}
}
let result = '';
for (let row = 0; row < numRows; row++) {
for (let col = 0; col < numColumns; col++) {
result += grid[row][col];
}
}
return result;
}
const argv = yargs(hideBin(process.argv))
.option('message', {
alias: 'm',
description: 'The message to encrypt or decrypt',
type: 'string',
demandOption: true
})
.option('key', {
alias: 'k',
description: 'The key used for encryption or decryption',
type: 'string',
demandOption: true
})
.option('encrypt', {
alias: 'e',
description: 'Set to true to encrypt, false to decrypt',
type: 'boolean',
default: true
})
.help()
.argv;
const result = argv.encrypt
? columnarTranspositionEncrypt(argv.message, argv.key)
: columnarTranspositionDecrypt(argv.message, argv.key);
console.log('Result:', result);