如何对字符(TypeScript)进行基本加密?
How to do basic encryption on characters (TypeScript)?
我想用 RSA public 和私钥加密一个字符串。但是,当我尝试将字符解密回初始 ascii 值时,它们 return 有所不同。下面是我加解密的方法:
/**
* Method to encrypt a string using associated public-key
* @param plainText string to cipher
* @returns string of encrypted plainText
*/
public encryptData(plainText: string): string {
let cipher = "";
for (let i = 0; i < plainText.length; i++) {
console.log(plainText.charCodeAt(i));
let temp: number = Math.pow(plainText.charCodeAt(i), this.e) % this.n;
console.log(String.fromCharCode(temp).charCodeAt(i));
cipher += String.fromCharCode(temp);
}
return cipher;
}
/**
* Method to decrypt a string using associated private-key
* @param cipherText string to decrypt
* @returns string of encrypted plainText
*/
public decryptData(cipherText: string): string {
let text = "";
for (let i = 0; i < cipherText.length; i++) {
console.log(cipherText.charCodeAt(i));
let temp: number = Math.pow(cipherText.charCodeAt(i), this.d) % this.n;
text += String.fromCharCode(temp);
}
return text;
}
n
、e
、d
分别为15、7、13。如有任何建议,我们将不胜感激!
编辑
找到了解决问题的方法,在创建变量时使用下面的方法temp
。
private modular_pow(base: number, expo: number, modulo: number) {
base = base % modulo;
var result = 1;
var x = base;
while(expo > 0){
var leastSignificantBit = expo % 2;
expo = Math.floor(expo / 2);
if (leastSignificantBit == 1) {
result = result * x;
result = result % modulo;
}
x = x * x;
x = x % modulo;
}
return result;
}
模数N的大小决定教科书RSA的最大载荷。因为它是值 15,所以消息值必须是 14 或更低。
字符通常至少在 0..25 范围内,这不是字符值,而是字母表中的索引。因此,要么进一步拆分字符,要么需要使用更大的模数(例如 p = 7、q = 19 和所有重要的 n=133,它们能够处理任何 ASCII 字符(当然在可打印字符之外徘徊)某些值的 ASCII)。
请注意,如果您的 RSA 组件较大,则必须使用 a specialized algorithm 执行模幂运算,而不是先执行幂运算,然后再进行模计算,后者效率非常低,并且可能会导致在求幂步骤中整数溢出(或类似的东西)。
另请注意,教科书 RSA 的输出必须放入方案中的(可打印)字符中。作为练习,您也可以只使用由 space 分隔的数字,忽略密文的增长。
我想用 RSA public 和私钥加密一个字符串。但是,当我尝试将字符解密回初始 ascii 值时,它们 return 有所不同。下面是我加解密的方法:
/**
* Method to encrypt a string using associated public-key
* @param plainText string to cipher
* @returns string of encrypted plainText
*/
public encryptData(plainText: string): string {
let cipher = "";
for (let i = 0; i < plainText.length; i++) {
console.log(plainText.charCodeAt(i));
let temp: number = Math.pow(plainText.charCodeAt(i), this.e) % this.n;
console.log(String.fromCharCode(temp).charCodeAt(i));
cipher += String.fromCharCode(temp);
}
return cipher;
}
/**
* Method to decrypt a string using associated private-key
* @param cipherText string to decrypt
* @returns string of encrypted plainText
*/
public decryptData(cipherText: string): string {
let text = "";
for (let i = 0; i < cipherText.length; i++) {
console.log(cipherText.charCodeAt(i));
let temp: number = Math.pow(cipherText.charCodeAt(i), this.d) % this.n;
text += String.fromCharCode(temp);
}
return text;
}
n
、e
、d
分别为15、7、13。如有任何建议,我们将不胜感激!
编辑
找到了解决问题的方法,在创建变量时使用下面的方法temp
。
private modular_pow(base: number, expo: number, modulo: number) {
base = base % modulo;
var result = 1;
var x = base;
while(expo > 0){
var leastSignificantBit = expo % 2;
expo = Math.floor(expo / 2);
if (leastSignificantBit == 1) {
result = result * x;
result = result % modulo;
}
x = x * x;
x = x % modulo;
}
return result;
}
模数N的大小决定教科书RSA的最大载荷。因为它是值 15,所以消息值必须是 14 或更低。
字符通常至少在 0..25 范围内,这不是字符值,而是字母表中的索引。因此,要么进一步拆分字符,要么需要使用更大的模数(例如 p = 7、q = 19 和所有重要的 n=133,它们能够处理任何 ASCII 字符(当然在可打印字符之外徘徊)某些值的 ASCII)。
请注意,如果您的 RSA 组件较大,则必须使用 a specialized algorithm 执行模幂运算,而不是先执行幂运算,然后再进行模计算,后者效率非常低,并且可能会导致在求幂步骤中整数溢出(或类似的东西)。
另请注意,教科书 RSA 的输出必须放入方案中的(可打印)字符中。作为练习,您也可以只使用由 space 分隔的数字,忽略密文的增长。