【发布时间】:2009-11-30 18:32:08
【问题描述】:
嘿,我正在使用公式 [x-> (x+shift-1) mod 127 + 1] 在 Java 中制作一个简单的凯撒密码,我希望我的加密文本具有除控制字符之外的 ASCII 字符(即从 32-127)。如何避免在加密文本中应用 0-31 的控制字符。谢谢。
【问题讨论】:
-
家庭作业?如果是这样,请将其标记为这样。
标签: java cryptography ascii
嘿,我正在使用公式 [x-> (x+shift-1) mod 127 + 1] 在 Java 中制作一个简单的凯撒密码,我希望我的加密文本具有除控制字符之外的 ASCII 字符(即从 32-127)。如何避免在加密文本中应用 0-31 的控制字符。谢谢。
【问题讨论】:
标签: java cryptography ascii
这样的事情怎么样:
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]。
【讨论】:
将您的角色从 [32..127] 映射到 [0..95],执行 mod 95+1 并将结果映射回 [32..127]。
【讨论】:
通常密文采用 base64 编码,base16(十六进制)也可以。 Base64 最常用于密文,因为它占用的空间比十六进制少,十六进制最常用于消息摘要。在 java.util.prefs.Base64 库中,您将找到 byteArrayToBase64() 和 base64ToByteArray()。
附带说明,出于安全原因,您永远不要编写自己的加密算法,您应该使用分组密码或流密码。我希望这是为了好玩!
【讨论】:
那里!有没有办法考虑整个字符范围?例如,“á”、“é”、“ö”、“ñ”,而不考虑“”([空格])? (例如,我的字符串是“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 再见!
【讨论】:
为什么不试试
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);
}
}
【讨论】:
将此复制粘贴到名称为“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());
}
}
}
【讨论】:
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();
}
}
【讨论】: