Java Cryptography仿射密码错误输出

时间:2013-08-15 19:22:32

标签: java encryption cryptography output

我正在尝试做一个仿射方法,但我的输出是完全错误的,我不知道如何解决它,任何人都可以看看它并告诉我有什么问题

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 
}

3 个答案:

答案 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;   

}