如果有人知道这些算法的含义,请帮助我理解,因为我不想简单地复制而不知道它是如何工作的。
以下是代码:
1:
public static String encryptKey(String key){
int ch = 0;
StringBuilder encryptedKey = new StringBuilder();
for(int i = 0; i < key.length(); i++ ){
ch = key.charAt(i);
ch = ~ch;
encryptedKey.append(ch);
}
return encryptedKey.toString();
}
2:
public String encrypt(String message, String key){
StringBuilder encryptedMessage = new StringBuilder();
char ch;
int j = 0;
for(int i = 0; i < message.length(); i++, j++ ){
if(j >= key.length()){
j = 0;
}
ch = message.charAt(i);
ch = (char) (key.charAt(j) ^ ch);
encryptedMessage.append(ch);
}
return encryptedMessage.toString();
}
再次感谢,
答案 0 :(得分:8)
这是两种简单且标准的(并且完全不安全,但这是一种学习经验)以可逆方式改变数据的方法。
第一个使用ch = ~ch;
来切换角色中的所有位。因此,例如,字母a
(ASCII 97或二进制01100001
)将变为10011110
。这是可逆的,因为您可以对加密数据应用完全相同的操作来检索原始消息。
第二个稍微更安全,并使用^
(exclulsive-or)运算符根据密钥更改每个字符中的位:将消息字符中的每个位与密钥中的相应位进行比较字符。如果位相同(0
或两者1
),则加密位为0
。如果位不同,则加密位为1
。这是可逆的,因为您可以使用相同的密钥再次应用相同的^
操作来检索原始邮件。
作为旁注,所有现代密码(例如DES3和AES)都基于异或操作,并结合了以指定方式“混合”位的算法,因此猜测密钥要困难得多。可以通过反向运行算法或通过采用数学上等效的计算捷径来解密密文。
警告,咆哮:这显然是家庭作业,你已经承认你和你的朋友都在通过复制别人的答案作弊。如果你不能解释它,那就更糟了,特别是因为我向你保证,所有参加课程并复制答案的学生都会产生同样的2个解决方案。更愚蠢的是加密很简单:一切都归结为翻转位。
所以这是密码学的本质:
1
而将第6位设置为0
将不起作用,因为你不再知道它们原来是什么。但是交换第3和第6位会很好;你只需要再次交换它们来解密。要解密,请遵循相同的算法,但要反转用于修改每个字符的规则。
Uibu't bt uifsf jt up ju。 Hppe mvdl!