【问题标题】:How to write Logic for Affine Cipher Decryption in JAVA?如何在 JAVA 中编写仿射密码解密的逻辑?
【发布时间】:2013-10-26 10:13:25
【问题描述】:

您好,我正在研究 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*(character - 'a') + secondKey) % 26 + 'a');

什么是解密逻辑。我完全糊涂了?

【问题讨论】:

    标签: java encryption


    【解决方案1】:

    通用仿射密码解密公式很简单:

    其中 a 是您的 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
    

    【讨论】:

    • 哦,谢谢伙计,这是我不知道如何计算第一个键的倒数的唯一问题。我不熟悉java。你真的救了我。非常感谢.....
    • 不客气。对于将来可能面临同样问题的任何人,请将答案标记为已接受
    • 我正在整理...复制粘贴代码。不知道为什么。
    猜你喜欢
    • 2023-02-04
    • 2021-04-15
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多