我正在尝试做一个仿射方法,但我的输出是完全错误的,我不知道如何解决它,任何人都可以看看它并告诉我有什么问题
public void Affine(int a, int b){
StringBuilder builder = new StringBuilder();
int len = jMesaj.getText().length(); //length of the input
for (int i = 0; i < len; i++){
char currentChar = jMesaj.getText().charAt(i);
char finalChar = ((char)(currentChar +(a*i + b)% 26));
builder.append(finalChar);
}
String result = builder.toString();
builder.delete( 0 , builder.length() -1 );
jEncryptionResult.setText(result); //display result in jTextArea
}
答案 0 :(得分:1)
在我看来,你假设'A'= 1,'B'= 2等。此外,affine algorithm略有不同。如果你使用26作为模块,那么你就会把你从'A'加密到'Z'。如果这是真的,那么尝试在这一行中添加一个偏移量,如下所示:
char finalChar = (char)((a*(currentChar - 'A') + b) % 26 + 'A');
答案 1 :(得分:0)
char是0-65536之间的值(2字节,2 ^ 16)。对于Unicode的东西来说有点混乱,至少如果你想在你的seçretcömmünìcåtiön中使用esötéricçhåräcters。
如果你事先知道你的字母表,那么更简单的实现就是使用
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] alphabet = str.toCharArray(); //make sure it's sorted for binarySearch to work!
然后通过java.utils.Array.binarySearch(alphabet, char)
查找传入字符的位置,对返回的int
数组位置进行数学运算(以alphabet
数组的长度为模)并查找加密这个位置的信件把它放在你的消息StringBuilder
中。
您还可以创建两个HashMaps<char,char>
,一个用于加密,另一个用于解密。
答案 2 :(得分:0)
/ ** *类:AffineCipher * * @author:Oracle * *撰写时间:2013年8月26日下午9:01:28 * *编译器:NetBeans 7.3.1 * *平台:Windows 7旗舰版 * /
package enigma;
公共类AffineCipher {public String Encryption(String plainText, int a , int b){
StringBuilder builder = new StringBuilder();
int len = plainText.length();
for (int i = 0; i < len; i++){
char currentChar = plainText.toUpperCase().charAt(i);
int IntcurrentChar = (int) currentChar - 65;
int finalCharInt = (a* IntcurrentChar + b) % 26;
int FinalCharint = finalCharInt + 65;
char finalChar = (char) FinalCharint;
builder.append(finalChar);
}
String result = builder.toString().toLowerCase();
return result;
}//end String Encryption
public String Encrypt(String plainText, int a, int b ){
int len = plainText.length();
StringBuilder sb = new StringBuilder();
String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for(int i = 0 ; i < len ; i++){
int charPos = alphabet.indexOf(plainText.charAt(i));
/*
*Read the character from input and get the position of the it in string
*/
int keyVal = (a* charPos+b) % 26;
/*
* keyVal store the position of the character that replace the one from the input
*/
char finalChar = alphabet.charAt(keyVal);
sb.append(finalChar);
}
String result = sb.toString();
return result;
}