Java 自制的加密机/解密机未按预期工作,密钥超过3个字符
单击加密机上的convert(转换)按钮时触发此事件。它切换并显示结果Java 自制的加密机/解密机未按预期工作,密钥超过3个字符,java,encryption,Java,Encryption,单击加密机上的convert(转换)按钮时触发此事件。它切换并显示结果 private void jButton21ActionPerformed(java.awt.event.ActionEvent evt) { text = jTextField8.getText(); key = jTextField7.getText(); result = ""; //loop for a
private void jButton21ActionPerformed(java.awt.event.ActionEvent evt) {
text = jTextField8.getText();
key = jTextField7.getText();
result = "";
//loop for all items in text
for (int i=0; i<text.length(); i++) {
c = (int) text.charAt(i);
//loop for all items in key
for (int a=0; a<key.length(); a++) {
//adding ascii of each key value to ascii of text character
c += (int) key.charAt(a);
//adding I to make sure all letters dont appear the same
c += i;
//make sure ascii's stay between target values (excluding null)
while (c > 126) {
c -= 125;
}
}
//converting ascii back to char and adding to result
result += (char) c;
}
//displaying result in text box below
jTextField6.setText(result);
}
private void jButton21ActionPerformed(java.awt.event.ActionEvent evt){
text=jTextField8.getText();
key=jTextField7.getText();
结果=”;
//文本中所有项目的循环
对于(int i=0;i,这是因为您正在转换为32以下的ASCII值,而这不是您想要的。GUI前端将它们呈现为空格,这反过来会导致解密的错误输出
将加密检查器设置为
while (c > 126) {
c -= 93; // was -125
}
和你的解密到
while (c < 1) {
c += 93;
}
while(c<1){
c+=93;
}
遇到此类问题时,您应该:
- 提取与您的问题相关的代码并删除不必要的内容
- 以编程方式测试输入/输出
请参见下面的内容。一旦完成此操作,您将意识到您的代码按预期工作,但第二个加密字符串包含一个行返回,您可能无法轻松复制粘贴。您应该将范围限制为可打印字符(32-126)
程序的输出为:
ok:aaa(key=aa)=>)+-=>aaa
确定:aaa(密钥=aaa)=>
=>aaa
您可以看到第二次运行中有一个换行符
publicstaticvoidmain(字符串[]args){
测试(“aaa”、“aa”);
测试(“aaa”、“aaa”);
}
私有静态无效测试(字符串输入,字符串键){
字符串加密=加密(输入,密钥);
字符串解密=解密(加密,密钥);
if(解密的.equals(输入)){
系统输出打印(“确定:”;
}否则{
系统输出打印(“错误:”);
}
System.out.println(输入+“(key=“+key+”)=>“+加密+”=>“+解密);
}
公共静态字符串加密(字符串输入、字符串密钥){
字符串结果=”;
对于(int i=0;i126){
c-=125;
}
}
//将ascii转换回字符并添加到结果
结果+=(字符)c;
}
返回结果;
}
公共静态字符串解密(字符串输入,字符串密钥){
字符串结果=”;
对于(int i=0;i
嗯,显示非ascii字符高度依赖于输出系统。您的第二次加密测试不会在三个空格中结束,而是在相应代码13(CR或'\r')、14和15的三个不可打印字符中结束
您的输出系统(GUI)不知道如何显示它们,也不输出任何内容,您错误地将其视为3个空格
结论:您的加密系统不能保证输出可打印的字符串,并且不能直接使用。您至少应该在base64中对输出值进行编码,以确保其可打印。您应该将加密/解密内容提取到单独的类中-这将使您能够单独测试算法,而无需同时处理GUI位…屏幕截图与此问题无关,因为它与GUI无关,请删除图像,只添加相关文本(输入、输出、预期输出)
while (c < 1) {
c += 93;
}
public static void main(String[] args) {
test("aaa", "aa");
test("aaa", "aaa");
}
private static void test(String input, String key) {
String encrypted = encrypt(input, key);
String decrypted = decrypt(encrypted, key);
if (decrypted.equals(input)) {
System.out.print("ok: ");
} else {
System.out.print("error: ");
}
System.out.println(input + " (key=" + key + ") => " + encrypted + " => " + decrypted);
}
public static String encrypt(String input, String key) {
String result = "";
for (int i = 0; i < input.length(); i++) {
int c = (int) input.charAt(i);
//loop for all items in key
for (int a = 0; a < key.length(); a++) {
//adding ascii of each key value to ascii of text character
c += (int) key.charAt(a);
//adding I to make sure all letters dont appear the same
c += i;
//make sure ascii's stay between target values (excluding null)
while (c > 126) {
c -= 125;
}
}
//converting ascii back to char and adding to result
result += (char) c;
}
return result;
}
public static String decrypt(String input, String key) {
String result = "";
for (int i = 0; i < input.length(); i++) {
int c = (int) input.charAt(i);
for (int a = 0; a < key.length(); a++) {
c -= (int) key.charAt(a);
c -= i;
while (c < 1) {
c += 125;
}
}
result += (char) c;
}
return result;
}