1

我正在尝试使用仿射方法,但我的输出完全错误,我不知道如何修复它,任何人都可以看看它并告诉我出了什么问题

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 
}
4

3 回答 3

1

在我看来,您假设'A' = 1,'B' = 2,等等。而且,仿射算法略有不同。如果您使用 26 作为模块,我觉得您正在从“A”到“Z”进行加密。如果这是真的,那么尝试在这一行中添加一个偏移量,如下所示:

char finalChar = (char)((a*(currentChar - 'A') + b) % 26 + 'A');
于 2013-08-15T19:30:14.410 回答
0

char 是介于 0-65536(2 个字节,2^16)之间的值。Unicode 的东西有点乱,至少如果你想在你的秘密 cö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)并从该位置查找加密的字母,将其放入您的 out-messageStringBuilder中。

您还可以创建两个HashMaps<char,char>,一个用于加密,另一个用于解密。

于 2013-08-15T19:59:44.897 回答
0

/** * 类:AffineCipher * * @author:Oracle * * 编写时间:2013 年 8 月 26 日晚上 9:01:28 * * 编译器:NetBeans 7.3.1 * * 平台:Windows 7 Ultimate */

包谜;

公共类仿射密码{

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;   

}
于 2013-08-26T19:11:30.770 回答