Java安全学习笔记(一)--凯撒密码
2015-12-02 17:15
141 查看
凯撒密码是罗马扩张时期朱丽斯·凯撒创造的,用于加密通过信使传递的作战命令。加密的过程是将字母表中的字母移动一定,从而实现文本的加密。如果将字母表中的字母向右移动2位,则字母A将变为C,字母B将变为D,以此类推,一个明文字符串Hello就被加密成Jgnnq。之后解密,就会返回原字符串。这里,移动的位数2是加密和解密所用的密钥。
凯撒密码的技术要点:
提取出要加密的字符串、密钥‘
将字符串中每个字符都取出并进行移位。
字母表中共有26个字符,在移位前先将移动的位数Key和26取模。J***A将字符加上一个正整数即代表在字母表中右移多少位。如果移动的位数是负值,则代表在字母表中左移多少位。
尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或者左移仍然嫩发生超界。如字母x右移4位应该是是字母b,但是将字母x增加4后超出26个字母的范围,当然此时的密码仍然可能有意义(没有超出ASC码表的范围),此处明文被表示成是其他的ASC码。该例子只是把明文表示成26个字母,所以此时要增加两个if语句判断一下,如果向左超界(c<'a')则增加26;如果向右超界(c>'z')则减去26。同时由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。
凯撒密码的技术要点:
提取出要加密的字符串、密钥‘
将字符串中每个字符都取出并进行移位。
package corejava; import java.util.Scanner; /** * 密码:凯撒密码 * */ public class TestCaesar { public static void main(String[] args) { System.out.println("[A 加密][J 解密],Please Choose One"); Scanner c=new Scanner(System.in);//创建Scanner键盘输入对象 String s1=c.nextLine();//获取本行的字符串 if(s1.equalsIgnoreCase("A")){ System.out.println("请输入明文:"); Scanner sc=new Scanner(System.in); String s=sc.nextLine(); System.out.println("请输入密钥:"); Scanner sc1=new Scanner(System.in); int key=sc1.nextInt();//将下一个输入项转换成int类型 Encryption(s, key); }else if(s1.equalsIgnoreCase("J")){ System.out.println("请输入密文:"); Scanner sc=new Scanner(System.in); String s=sc.nextLine(); System.out.println("请输入密钥:"); Scanner sc1=new Scanner(System.in); int key=sc1.nextInt();//将下一个输入项转换成int类型 Decrypt(s, key);//調用解密方法 } } public static void Encryption(String str,int k){//加密 String string=""; for (int i = 0; i < str.length(); i++) { char c=str.charAt(i); if(c>='a'&&c<='z'){//如果字符串中的某个字符是小写字母 c+=k%26;//移动key%26; if(c<'a') c+=26; if(c>'z') c-=26; }else if(c>='A'&&c<='Z'){//如果字符串中的某个字符是大写字母 c+=k%26;//移动key%26; if(c<'A') c+=26; if(c>'Z') c-=26; } string+=c;//将加密后的字符串连成字符串 } System.out.println(str+" 加密后为: "+string); } public static void Decrypt(String str,int n){//解密 int k=Integer.parseInt("-"+n); String string=""; for (int i = 0; i < str.length(); i++) { char c=str.charAt(i); if(c>='a'&&c<='z'){//如果字符串中的某个字符是小写字母 c+=k%26;//移动key%26; if(c<'a') c+=26; if(c>'z') c-=26; }else if(c>='A'&&c<='Z'){//如果字符串中的某个字符是大写字母 c+=k%26;//移动key%26; if(c<'A') c+=26; if(c>'Z') c-=26; } string+=c;//将解密后的字符串连成字符串 } System.out.println(str+" 加密后为: "+string); } }注意:
字母表中共有26个字符,在移位前先将移动的位数Key和26取模。J***A将字符加上一个正整数即代表在字母表中右移多少位。如果移动的位数是负值,则代表在字母表中左移多少位。
尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或者左移仍然嫩发生超界。如字母x右移4位应该是是字母b,但是将字母x增加4后超出26个字母的范围,当然此时的密码仍然可能有意义(没有超出ASC码表的范围),此处明文被表示成是其他的ASC码。该例子只是把明文表示成26个字母,所以此时要增加两个if语句判断一下,如果向左超界(c<'a')则增加26;如果向右超界(c>'z')则减去26。同时由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。
相关文章推荐
- Java基本知识(连载)-面向对象入门
- SpringMVC执行流程
- JavaBase64编码 加密解密
- Java基础-反射
- eclipse里XML布局文件变成了 android1
- 在Eclipse中创建 Maven SpringMVC 项目 cannot change version web module 2.5 问题
- Java基本知识(连载)-数组、方法和字符串
- Spring MVC视图层:thymeleaf vs. JSP
- java_home should point to a jdk not a jre
- Java基本知识(连载)-分支和循环-2
- java List.subList方法中的超级大陷阱
- Java线程学习笔记(一)---启动和停止线程
- 把Eclipse项目迁移到AndroidStudio
- Java之控制反转和依赖注入
- java web应用文件打包下载
- Java基本知识(连载)-分支和循环-1
- springMVC中@RequestParam注解的用法
- Java GC CMS 日志分析
- spring mvc 访问静态资源404
- 有关JAVA中 "? extends" 和 "? super"的区别