2013-10-26 32 views
0

你好,我在JAVA工作的仿射密碼。我已經成功地編寫了加密代碼,但現在我對加密的邏輯沒有任何瞭解。如何在JAVA中編寫用於仿射密碼解密的邏輯?

下面是我的用於加密邏輯:

void encryption() 
{ 
    char character; 
    int plainTextLength=input.length(); 
    int a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10,k=11,l=12,m=13,n=14, 
     o=15,p=16,q=17,r=18,s=19,t=20,u=21,v=22,w=23,x=24,y=25,z=26; 

    System.out.print("Cipher text is:"); 

    for (int in = 0; in < plainTextLength; in++) 
    { 
     character = input.charAt(in); 

     if (Character.isLetter(character)) 
     { 
      character = (char)((firstKey*(character - 'a') + secondKey) % 26 + 'a'); 
     } 
     System.out.print(character); 
    } 
    System.out.println();  
} 

這是我的加密邏輯: 字符=(char)的((firstKey *(字符 - 'A')+ secondKey)%26 + '一' );

什麼是解密邏輯。我完全困惑?

回答

4

一般仿射加密解密公式很簡單:

enter image description here

其中一個是你的firstKeyb是你secondKey

所以加密/解密可通過以下方式來實現:

private static int firstKey = 5; 
private static int secondKey = 19; 
private static int module = 26; 

public static void main(String[] args) { 
    String input = "abcdefghijklmnopqrstuvwxyz"; 
    String cipher = encrypt(input); 
    String deciphered = decrypt(cipher); 
    System.out.println("Source: " + input); 
    System.out.println("Encrypted: " + cipher); 
    System.out.println("Decrypted: " + deciphered); 
} 

static String encrypt(String input) { 
    StringBuilder builder = new StringBuilder(); 
    for (int in = 0; in < input.length(); in++) { 
     char character = input.charAt(in); 
     if (Character.isLetter(character)) { 
      character = (char) ((firstKey * (character - 'a') + secondKey) % module + 'a'); 
     } 
     builder.append(character); 
    } 
    return builder.toString(); 
} 

static String decrypt(String input) { 
    StringBuilder builder = new StringBuilder(); 
    // compute firstKey^-1 aka "modular inverse" 
    BigInteger inverse = BigInteger.valueOf(firstKey).modInverse(BigInteger.valueOf(module)); 
    // perform actual decryption 
    for (int in = 0; in < input.length(); in++) { 
     char character = input.charAt(in); 
     if (Character.isLetter(character)) { 
      int decoded = inverse.intValue() * (character - 'a' - secondKey + module); 
      character = (char) (decoded % module + 'a'); 
     } 
     builder.append(character); 
    } 
    return builder.toString(); 
} 

輸出:

Source: abcdefghijklmnopqrstuvwxyz 
Encrypted: dinsxchmrwbglqvafkpuzejoty 
Decrypted: abcdefghijklmnopqrstuvwxyz 
+0

哦感謝的人,這是我不知道如何計算逆唯一的問題第一把鑰匙。我不熟悉java。你真的救了我。非常感謝..... –

+0

不客氣。請將回答標記爲接受任何可能在將來面臨同樣問題的人 – Jk1

+0

是的,我已經做了..... –