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