【问题标题】:Simple caesar cipher in javajava中的简单凯撒密码
【发布时间】:2009-11-30 18:32:08
【问题描述】:

嘿,我正在使用公式 [x-> (x+shift-1) mod 127 + 1] 在 Java 中制作一个简单的凯撒密码,我希望我的加密文本具有除控制字符之外的 ASCII 字符(即从 32-127)。如何避免在加密文本中应用 0-31 的控制字符。谢谢。

【问题讨论】:

  • 家庭作业?如果是这样,请将其标记为这样。

标签: java cryptography ascii


【解决方案1】:

这样的事情怎么样:

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]。

【讨论】:

    【解决方案2】:

    将您的角色从 [32..127] 映射到 [0..95],执行 mod 95+1 并将结果映射回 [32..127]。

    【讨论】:

      【解决方案3】:

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

      附带说明,出于安全原因,您永远不要编写自己的加密算法,您应该使用分组密码或流密码。我希望这是为了好玩!

      【讨论】:

        【解决方案4】:

        那里!有没有办法考虑整个字符范围?例如,“á”、“é”、“ö”、“ñ”,而不考虑“”([空格])? (例如,我的字符串是“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 再见!

        【讨论】:

          【解决方案5】:

          为什么不试试

          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); } }

          【讨论】:

            【解决方案6】:

            将此复制粘贴到名称为“caesar”的 NetBeans 中:

                //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());
            }
            }
            

            }

            【讨论】:

              【解决方案7】:
              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();
              
                  }
              
              }
              

              【讨论】:

              • 如有任何帮助,请联系我。
              猜你喜欢
              • 1970-01-01
              • 2012-09-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-08-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多