在java中的简单凯撒密码

时间:2009-11-30 18:32:08

标签: java cryptography ascii

嘿,我正在用Java编写一个简单的caesar密码[x-​​> (x + shift-1)mod 127 + 1]我希望我的加密文本除了控制字符外都有ASCII字符(即32-127)。如何避免0-31应用加密文本中的控制字符。谢谢。

7 个答案:

答案 0 :(得分:8)

这样的事情怎么样:

public String applyCaesar(String text, int shift)
{
    char[] chars = text.toCharArray();
    for (int i=0; i < text.length(); i++)
    {
        char c = chars[i];
        if (c >= 32 && c <= 127)
        {
            // Change base to make life easier, and use an
            // int explicitly to avoid worrying... cast later
            int x = c - 32;
            x = (x + shift) % 96;
            if (x < 0) 
              x += 96; //java modulo can lead to negative values!
            chars[i] = (char) (x + 32);
        }
    }
    return new String(chars);
}

不可否认,这将127视为非控制角色,但不是......你可能希望调整它以保持范围为[32,126]。

答案 1 :(得分:1)

将你的人物从[32..127]映射到[0..95],做一个mod 95+1并将结果映射回[32..127]。

答案 2 :(得分:1)

通常密文是base64编码的,base16(hex)也很好用。 Base64最常用于密文,因为它占用的空间少于十六进制,十六进制最常用于消息摘要。在java.util.prefs.Base64库中,您将找到byteArrayToBase64()和base64ToByteArray()。

另外,为了安全起见,您不应该编写自己的加密算法,您应该使用分组密码或流密码。我希望这是为了好玩!

答案 3 :(得分:1)

有!有没有办法考虑整个字符范围?例如,“á”,“é”,“ö”,“ñ”,而不考虑“”([空间])? (例如,我的String是“Hello World”,标准结果是“Khoor#Zruog”;我想删除“#”,因此结果将是“KhoorZruog”)

我确定我的答案就在这段代码中:

if (c >= 32 && c <= 127)
        {
            // Change base to make life easier, and use an
            // int explicitly to avoid worrying... cast later
            int x = c - 32;
            x = (x + shift) % 96;
            chars[i] = (char) (x + 32);
        }

......但是我尝试了一些东西,但没有用:S所以,我会等你的答案:D见到你!

答案 4 :(得分:1)

为什么不试试

for(int i = 0; i < length; i++) { char c = chars[i] if(Character.isLetter(c)) { int x = c - 32; x = (x + shift) % 96; chars[i] = (char) (x+32); } }

答案 5 :(得分:1)

将其粘贴到NetBeans中,名称为“caesar”:

    //package caesar;
    import java.io.*;

    public class caesar {

    int offset=3;
    public String encrypt(String s) throws IOException
    {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++)
        {
            char t=s.charAt(i);
            if(t>='A' && t<='Z')
            {
                int t1=t-'A'+offset;
                t1=t1%26;
                sb.append((char)(t1+'A'));
            }
            else if(t>='a' && t<='z')
            {
                int t1=t-'a'+offset;
                t1=t1%26;
                sb.append((char)(t1+'a'));
            }
        }
        return sb.toString();
    }


    public String decrypt(String s) throws IOException
    {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++)
        {
            char t=s.charAt(i);
            if(t>='A' && t<='Z')
            {
                int t1=t-'A'-offset;
                if(t1<0)t1=26+t1;
                sb.append((char)(t1+'A'));
            }
            else if(t>='a' && t<='z')
            {
                int t1=t-'a'-offset;
                if(t1<0)t1=26+t1;
                sb.append((char)(t1+'a'));
            }
        }
        return sb.toString();
    }


public static void main(String[] args) {
try
{
    System.out.println("Caesar encrypion technique");
    BufferedReader b;
    String oriTxt,encTxt,decTxt;
    System.out.println("Enter string to encrypt:");
    b=new BufferedReader(new InputStreamReader(System.in));
    oriTxt=b.readLine();
    caesar c=new caesar();
    encTxt=c.encrypt(oriTxt);
    System.out.println("Encrypted text :"+encTxt);
    decTxt=c.decrypt(encTxt);
    System.out.println("Derypted text :"+decTxt);
}
catch(Exception e)
{
    System.out.println(e.toString());
}
}

}

答案 6 :(得分:0)

import java.util.Scanner;
//caeser

public class Major_Assingment {

public static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZhh";

public static String encrypt(String plainText,int shiftKey)
{

plainText = plainText.toUpperCase();

    String cipherText= " ";

    for(int i=0; i<plainText.length(); i++)
    {

        int charPosition = ALPHABET.indexOf(plainText.charAt(i));

        int keyVal = (shiftKey + charPosition)% 26 ;

        char replaceVal = ALPHABET.charAt(keyVal);

        cipherText += replaceVal;
        }

    return cipherText;
}

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("Enter the string for Encryption:");

        String message = new String();

        message = sc.next();

        System.out.println(encrypt(message,3));

        sc.close();

    }

}