192122 王一鸣
开始
String a; char b[];
int i=0; int d;char e;
请输入您要加
a=cin.nextLine();
i
b=a.toCharArray();
d=(((int)b[i]-96)+3)%26;
e=(char)(s+96);
输出e
结束 i=i+1;
二(源代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin =new Scanner(System.in);
String a;
char b[];
int s;
char d;
System.out.println("请输入明文:");
a=cin.nextLine();
for(int i=0;i
{
b=a.toCharArray();
s=(((int)b[i]-96)+3)%26;
d=(char)(s+96);
System.out.print(d);
}
}
}
Java实现RC4算法
import java.awt.*;
import java.awt.event.*; import javax.swing.*;
import java.io.*;
//程序窗口主
类;===================================================================
========
public class RC4Frame extends JFrame{
//窗口的
JPanel cp = (JPanel) getContentPane();
//按钮和单选器件
JPanel opPanel=new JPanel();
//除Label以外
JPanel infoPanel=new JPanel();
//Label
JPanel tPanel0=new JPanel();
//对应四个文本域
JScrollPane jsp0=new JScrollPane();
JScrollPane jsp1=new JScrollPane();
JScrollPane jsp2=new JScrollPane();
JScrollPane jsp3=new JScrollPane();
//四个
//分别为:明输入框,密钥输入框,
JTextArea jta0=new JTextArea(20,11);
JTextArea jta1=new JTextArea(20,11);
JTextArea jta2=new JTextArea(20,11);
JTextArea jta3=new JTextArea(20,11);
//加密/解密模式
JRadioButton jb1=new JRadioButton("明文加密");
JRadioButton jb2=new JRadioButton("密文解密");
//功能按钮;
JButton b1=new JButton("加 / 解密");
JButton b2=new JButton("打开明文");
JButton b3=new JButton("打开密文");
JButton b4=new JButton("保存密文");
JButton b5=new JButton("退出");
JButton b6=new JButton("清空");
ButtonGroup bg=new ButtonGroup();
//RC4加解
RC4Crypt rc4;
//保存密文结果的byte数组;
byte[] result;
//保存/打
JFileChooser jfc = new JFileChooser();
//RC4的构方法,包括初
public RC4Frame(){
setSize(640,450);
setVisible(true);
setResizable(false);
setTitle("RC4流密码加\\解密程序V1.0:");
setDefaultCloseOperation(EXIT_ON_CLOSE);
//将文本域填
jsp0.getViewport().add(jta0);
jsp1.getViewport().add(jta1);
jsp2.getViewport().add(jta2);
jsp3.getViewport().add(jta3);
//将子密框和秘文框
jta2.setEditable(false);
jta3.setEditable(false);
//为文本域添加
jta0.setLineWrap(true);
jta1.setLineWrap(true);
jta2.setLineWrap(true);
jta3.setLineWrap(true);
//初始化Lablel的版面;
tPanel0.setLayout(new GridLayout(1,5));
tPanel0.add(new JLabel("明文输
tPanel0.add(new JLabel("密码输
tPanel0.add(new JLabel("子密码
tPanel0.add(new JLabel("密文码
tPanel0.add(new JLabel(" "));
tPanel0.setSize(600,20);
//初始化程序的
infoPanel.setLayout(new GridLayout(1,5));
infoPanel.add(jsp0);
infoPanel.add(jsp1);
infoPanel.add(jsp2);
infoPanel.add(jsp3);
infoPanel.add(opPanel);
//初始化
cp.setLayout(new FlowLayout());
cp.add(tPanel0);
cp.add(infoPanel);
//初始化程序
opPanel.setLayout(new GridLayout(8,1));
opPanel.add(jb1);opPanel.add(jb2);
opPanel.add(b1);opPanel.add(b2);opPanel.add(b3);
opPanel.add(b4);opPanel.add(b5);opPanel.add(b6);
bg.add(jb1);bg.add(jb2);
jb1.setSelected(true);
//为控制按
b1.addActionListener(new B1_actionAdapter(this));
b2.addActionListener(new B2_actionAdapter(this));
b3.addActionListener(new B3_actionAdapter(this));
b4.addActionListener(new B4_actionAdapter(this));
b5.addActionListener(new B5_actionAdapter(this));
b6.addActionListener(new B6_actionAdapter(this));
//初始化RC4对象;
rc4=new RC4Crypt();
}
//加/解密按钮
protected void b1_actionPerformed (ActionEvent e){
//判是否可进行
boolean flag=true;
//输入密钥后才
if(!jta1.getText().equals("")){
//一个单选钮
if(jb1.isSelected()==true){
//调用RC4Crypy的第二
//参数为明
rc4=new RC4Crypt(jta0.getText(),jta1.getText());
jta2.setText("");
//加密过程中
for(int i=0;i
jta2.append("字节"+(i+1)+": "+rc4.subKey[i]+"\n");
}
//更新
result=rc4.result;
jta3.setText("");
//将密文的
for(int i=0;i
jta3.append("字节"+(i+1)+": "+rc4.result[i]+"\n");
}
}
//二个单选钮
else{
try{
//调用RC4Crypy的第三
rc4=new RC4Crypt(result,jta1.getText());
jta0.setText("");
//将加密过程中
for(int i=0;i
jta2.append("字节"+(i+1)+": "+rc4.subKey[i]+"\n");
}
//将解密
jta0.setText(rc4.recoverToString());
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}else{
//无
jta3.setText("请输入密钥!");
}
}
//打开明文文按钮的监听器
protected void b2_actionPerformed (ActionEvent e){
//将打开的明文
jta0.setText(openTextFile());
}
//打开保存过的密文数据文
protected void b3_actionPerformed (ActionEvent e){
//打开秘文
openResultFile();
}
//保存密文结文件按钮监听
protected void b4_actionPerformed (ActionEvent e){
//保存密文结
saveResultFile();
}
//退出按钮监听
protected void b5_actionPerformed (ActionEvent e){
System.exit(0);
}
//清空按钮监听
protected void b6_actionPerformed (ActionEvent e){
jta0.setText("");jta1.setText("");
jta2.setText("");jta3.setText("");
result=null;rc4=null;
}
//从.txt件中读取文本
private String openTextFile() {
String message = "";
//显示文件
if (JFileChooser.APPROVE_OPTION == jfc.showOpenDialog(this)) {
try {
//确定要读
String filename1 = jfc.getSelectedFile().getPath();
//立以此文件
File file = new File(filename1);
//确定文件
int size = (int) file.length();
//立存储从文件
char[] data = new char[size];
//建立
FileReader in = new FileReader(file);
int readChar = 0;
//字符逐个从文件读
while (in.ready()) {
readChar = readChar +
in.read(data, readChar, size - readChar);
}
//关闭
in.close();
//将字符数
message = new String(data, 0, readChar);
} catch (Exception e) {
message = e.getMessage();
}
}
return message;
}
//从密文结果件中读取数
private String openResultFile() {
String message = "";
//显示文件
if (JFileChooser.APPROVE_OPTION == jfc.showOpenDialog(this)) {
try {
//确定要读
String filename1 = jfc.getSelectedFile().getPath();
//立以此文件
File file = new File(filename1);
//确定文件
int size = (int) file.length();
//显示本
jta3.setText("共有"+size+"字节\n");
byte temp=(byte)0;
//重新建立个容量等于文
result = new byte[size];
//立标准数据类
DataInputStream in=new DataInputStream(new FileInputStream(file));
//逐字节读取文件中的
for (int i=0;i<>
temp= in.readByte();
jta3.append("
result[i]=temp;
}
//关
in.close();
} catch (Exception e) {
message = e.getMessage();
}
}
return message;
}
//将密文结果入结果文件的
private String saveResultFile(){
String message = "";
//保
if ((result instanceof byte[])&&
//显示文
(JFileChooser.APPROVE_OPTION == jfc.showSaveDialog(this))) {
try {
//确定要读
String filename1 = jfc.getSelectedFile().getPath();
//立以此文件
File file = new File(filename1);
//立标准数据类
DataOutputStream out=new DataOutputStream(new FileOutputStream(file));
//
for (int i=0;i
out.writeByte(result[i]);
}
//关闭文
out.close();
} catch (Exception e) {
message = e.getMessage();
}
}
return message;
}
//程序测试方法;************************************************************
public static void main(String[] args){
RC4Frame mainframe=new RC4Frame();
System.out.println("Hello World!");
}
}
//RC4加/
类;===================================================================
class RC4Crypt{
//S盒的byte数组;
private byte[] box;
//明文的
public String plaintext;
//明文byte数组;
public byte[] bytePlaintext;
//密文结果的byte数组;
public byte[] result;
//输入密钥
public String mainKey;
//子密钥的byte数组;
public byte[] subKey;
//本加/解密明/
public int length;
//无参数构造方
public RC4Crypt(){
//顺序初
makeBox();
}
//用于实现明加密的构造方
public RC4Crypt(String a,String b){
//明文,密钥字
plaintext=a;
mainKey=b;
//顺序初
makeBox();
//用明字符串初始
getBytePlaintext();
try{
//初始化本
length=bytePlaintext.length;
//初始化子密
getSubKey();
//进行
encrypt();
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
//实现密文解
public RC4Crypt(byte[] a,String b){
//密文byte数组,
result=a;
mainKey=b;
//顺序初
makeBox();
try{
//初始化本
length=result.length;
//初始化子密
getSubKey();
//进行
decrypt();
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
//初始化S盒
private void makeBox(){
box=new byte[256];
//用00000000B到11111111B的内容依次初始化S盒;
//注意byte类型数据表示0-255无符号数字的顺序;
//00000000B(0)-01111111B(127)-10000000B(-128)-11111111B(-1)
for(int i=0;i<256;i++){>256;i++){>
if(i<127){>127){>
box[i]=(byte)i;
}else{
box[i]=(byte)(i-256);
}
}
}
//把明文改变
private void getBytePlaintext(){
bytePlaintext=plaintext.getBytes();
}
//把byte组恢复成字符串
public String recoverToString(){
return new String(bytePlaintext);
}
//获得自密钥的
private void getSubKey()throws Exception{
//声明所需
int j=0,hold=0;
byte temp=0;
byte []key =mainKey.getBytes();
//通过j值的变化和密
for (int i=0; i<256; i++){="">256;>
//j的
j=(j+(box[i]>0?box[i]:(box[i]+256))
+(key[i%key.length]>0?key[i%key.length]:(key[i%key.length]+256)))%256;
//空
temp=box[i];box[i]=box[j];box[j]=temp;
}
int i=j=0;
//声明一个容
subKey=new byte[length];
for(int k=0;k
//
i=++i%256;
//j第二
j=(j+(box[i]>0?box[i]:(box[i]+256)))%256;
//空
temp=box[i];box[i]=box[j];box[j]=temp;
//子钥byte
subKey[k]=box[((box[i]>0?box[i]:(box[i]+256))+(box[j]>0?box[j]:(box[j]+256)))%256];
}
}
//加密计算方法;************************************************************
private void encrypt()throws Exception{
result=new byte[length];
//明文byte数组与子密钥byte
for(int i=0;i
result[i]=(byte)(bytePlaintext[i]^subKey[i]);
}
}
//解密计算方法;************************************************************
private void decrypt()throws Exception{
bytePlaintext=new byte[length];
//密文byte数组于子密钥byte
for(int i=0;i
bytePlaintext[i]=(byte)(result[i]^subKey[i]);
}
}
}
//各按钮的监
类;============================================================
class B1_actionAdapter implements ActionListener {
private RC4Frame adaptee;
B1_actionAdapter(RC4Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.b1_actionPerformed(e);
}
}
class B2_actionAdapter implements ActionListener {
private RC4Frame adaptee;
B2_actionAdapter(RC4Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.b2_actionPerformed(e);
}
}
class B3_actionAdapter implements ActionListener {
private RC4Frame adaptee;
B3_actionAdapter(RC4Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.b3_actionPerformed(e);
}
}
class B4_actionAdapter implements ActionListener {
private RC4Frame adaptee;
B4_actionAdapter(RC4Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.b4_actionPerformed(e);
}
}
class B5_actionAdapter implements ActionListener {
private RC4Frame adaptee;
B5_actionAdapter(RC4Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.b5_actionPerformed(e);
}
}
class B6_actionAdapter implements ActionListener {
private RC4Frame adaptee;
B6_actionAdapter(RC4Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.b6_actionPerformed(e);
}
}
凯撒加密算法
实 验 报 告
实验名称 实验 凯撒密码算法
姓名 学号
日期 地点
成绩 教师
备注:
第1页 共3页
上海理工大学计算工程学院 实验报告
实现凯撒密码算法,包括加密解密,要求程序能正确行,输入
2.实验环境(
操作系统:win7
编程环境:Visual C++
3.实验方法
判断字符串的ASCLL码,然后右移3位加密
#include main() { char m[100]; char c[100]; char j[100]; int i; printf("请输 gets(m); for(i=0;m[i]!='\0';i++) { if(m[i]>='a'&&m[i]<='z')>='z')> c[i]=(m[i]-'a'+3)%26+'a'; else if(m[i]>='A'&&m[i]<='z')>='z')> c[i]=(m[i]-'A'+3)%26+'A'; else c[i]=' '; } c[i]='\0'; printf("加密后的结果:\n%s\n",c); for(i=0;m[i]!='\0';i++) { if(c[i]>='a'&&c[i]<='z')>='z')> j[i]=(c[i]-'a'-3)%26+'a'; else if(c[i]>='A'&&c[i]<='z')>='z')> - 2 - 上海理工大学算机工程学院 实 j[i]=(c[i]-'A'-3)%26+'A'; else j[i]=' '; } j[i]='\0'; printf("解密后的结果:\n%s\n",j); } 5.结论 通过本次实验,将凯密码算法的理论用到实践中来,利用C语言现了撒密码算法的加程,将理论与实践结合起来,加深 - 3 - JAVA 实 192121 陈君山 二.源代码 import java.util.*; public class Main { public static void main(String[] args) { Scanner cin =new Scanner(System.in ); String a; char b[]; int s; char d; System.out .println( for (int i=0;i { b=a.toCharArray(); s=(((int )b[i]-96)+3)%26; d=(char )(s+96); System.out .print(d); } } } Java 实现 RC4算法 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; //程 序 窗 口 主 类 ;=================================================================== ======== public class RC4Frame extends JFrame{ //窗口的主 JPanel cp = (JPanel) getContentPane(); //按钮和单选器件 JPanel opPanel=new JPanel(); //除 Label 以外 JPanel infoPanel=new JPanel(); //Label所 JPanel tPanel0=new JPanel(); //对应四个文本域 JScrollPane jsp0=new JScrollPane(); JScrollPane jsp1=new JScrollPane(); JScrollPane jsp2=new JScrollPane(); JScrollPane jsp3=new JScrollPane(); //四个文本域 , //分别为 :明文输框 , 密输入框 , JTextArea jta0=new JTextArea(20,11); JTextArea jta1=new JTextArea(20,11); JTextArea jta2=new JTextArea(20,11); JTextArea jta3=new JTextArea(20,11); //加密 /解密模式 JRadioButton jb1=new JRadioButton( JRadioButton jb2=new JRadioButton( //功能按钮 ; JButton b1=new JButton( JButton b2=new JButton( JButton b3=new JButton( JButton b4=new JButton( JButton b5=new JButton( JButton b6=new JButton( ButtonGroup bg=new ButtonGroup(); //RC4加解 RC4Crypt rc4; //保存密文结果的 byte 数组 ; byte[] result; //保存 /打 JFileChooser jfc = new JFileChooser(); //RC4的构造方法 , 包括初始化版 setSize(640,450); setVisible(true); setResizable(false); setTitle( setDefaultCloseOperation(EXIT_ON_CLOSE); //将文本域填入 jsp0.getViewport().add(jta0); jsp1.getViewport().add(jta1); jsp2.getViewport().add(jta2); jsp3.getViewport().add(jta3); //将子密框和秘文框 jta2.setEditable(false); jta3.setEditable(false); //为文本域添加 jta0.setLineWrap(true); jta1.setLineWrap(true); jta2.setLineWrap(true); jta3.setLineWrap(true); //初始化 Lablel 的版面 ; tPanel0.setLayout(new GridLayout(1,5)); tPanel0.add(new JLabel( tPanel0.add(new JLabel( tPanel0.add(new JLabel( tPanel0.add(new JLabel( tPanel0.add(new JLabel( tPanel0.setSize(600,20); //初始化程序的 infoPanel.setLayout(new GridLayout(1,5)); infoPanel.add(jsp0); infoPanel.add(jsp1); infoPanel.add(jsp2); infoPanel.add(jsp3); infoPanel.add(opPanel); //初始化程 cp.setLayout(new FlowLayout()); cp.add(tPanel0); cp.add(infoPanel); //初始化程序控 opPanel.setLayout(new GridLayout(8,1)); opPanel.add(jb1);opPanel.add(jb2); opPanel.add(b1);opPanel.add(b2);opPanel.add(b3); opPanel.add(b4);opPanel.add(b5);opPanel.add(b6); bg.add(jb1);bg.add(jb2); jb1.setSelected(true); //为控制按钮 b1.addActionListener(new B1_actionAdapter(this)); b2.addActionListener(new B2_actionAdapter(this)); b3.addActionListener(new B3_actionAdapter(this)); b4.addActionListener(new B4_actionAdapter(this)); b5.addActionListener(new B5_actionAdapter(this)); b6.addActionListener(new B6_actionAdapter(this)); //初始化 RC4对象 ; rc4=new RC4Crypt(); } //加 /解密 //判断是否可进行操 boolean flag=true; //输入密钥后才能进 if(!jta1.getText().equals( //第一个单选钮被选 if(jb1.isSelected()==true){ //调用 RC4Crypy 的第二个 //参数为明文字 rc4=new RC4Crypt(jta0.getText(),jta1.getText()); jta2.setText( //将加密过程中产生 for(int i=0;i<> jta2.append( } //更新现阶 result=rc4.result; jta3.setText( //将密文的字 for(int i=0;i<> jta3.append( } } //第二个单选钮被选 else{ try{ //调用 RC4Crypy 的第三个 rc4=new RC4Crypt(result,jta1.getText()); jta0.setText( //将加密过程中产生 for(int i=0;i<> jta2.append( } //将解密得到 jta0.setText(rc4.recoverToString()); }catch(Exception ex){ System.out.println(ex.getMessage()); } } }else{ //无密钥提示 ; jta3.setText( } } //打开明文文按钮的监听器 //将打开的明文 jta0.setText(openTextFile()); } //打开保存过密文数据文 //打开秘文文 openResultFile(); } //保存密文结文件按钮监听 //保存密文结果 saveResultFile(); } //退出按钮监听 protected void b5_actionPerformed (ActionEvent e){ System.exit(0); } //清空按钮监 jta0.setText( jta2.setText( result=null;rc4=null; } //从 .txt 文件中 String message = //显示文件打 if (JFileChooser.APPROVE_OPTION == jfc.showOpenDialog(this)) { try { //确定要读取文 String filename1 = jfc.getSelectedFile().getPath(); //建立以此文件名为 File file = new File(filename1); //确定文件大小 , 单位字节 ; int size = (int) file.length(); //建立存从文件读出 char[] data = new char[size]; //建立文件 FileReader in = new FileReader(file); int readChar = 0; //按字符逐从文件读取字 while (in.ready()) { readChar = readChar + in.read(data, readChar, size - readChar); } //关闭文件 in.close(); //将字符数组 message = new String(data, 0, readChar); } catch (Exception e) { message = e.getMessage(); } } return message; } //从密文结果文件中读取 String message = //显示文件打 if (JFileChooser.APPROVE_OPTION == jfc.showOpenDialog(this)) { try { //确定要读取文 String filename1 = jfc.getSelectedFile().getPath(); //建立以此文件名为 File file = new File(filename1); //确定文件大小 , 单位字节 ; int size = (int) file.length(); //显示本文件 jta3.setText( byte temp=(byte)0; //重新建立一个容量于文件大小的 byte result = new byte[size]; //建立标数据类型的 DataInputStream in=new DataInputStream(new FileInputStream(file)); //逐个字节 for (int i=0;i<> temp= in.readByte(); jta3.append( result[i]=temp; } //关闭读取流 ; in.close(); } catch (Exception e) { message = e.getMessage(); } } return message; } //将密文结果存入结果文 String message = //保存条 if ((result instanceof byte[])&& //显示文件保 (JFileChooser.APPROVE_OPTION == jfc.showSaveDialog(this))) { try { //确定要读取文 String filename1 = jfc.getSelectedFile().getPath(); //建立以此文件名为 File file = new File(filename1); //建立标数据类型的 DataOutputStream out=new DataOutputStream(new FileOutputStream(file)); //逐个 for (int i=0;i<> out.writeByte(result[i]); } //关闭文件输 out.close(); } catch (Exception e) { message = e.getMessage(); } } return message; } //程序测试方 RC4Frame mainframe=new RC4Frame(); System.out.println( } } //RC4加 /解 密 数 据 处 理 类 ;=================================================================== class RC4Crypt{ //S盒的 byte 数组 ; private byte[] box; //明文的 public String plaintext; //明文 byte 数组 ; public byte[] bytePlaintext; //密文结果的 byte 数组 ; public byte[] result; //输入密钥 public String mainKey; //子密钥的 byte 数组 ; public byte[] subKey; //本加 /解密明 /密的字节长度 ; public int length; //无参数构造方法 ;********************************************************** public RC4Crypt(){ //顺序初始化 S 盒 ; makeBox(); } //用于实现明文加密的构 //明文 , 密钥字 plaintext=a; mainKey=b; //顺序初始化 S 盒 ; makeBox(); //用明文字串初始化明 getBytePlaintext(); try{ //初始化本对 length=bytePlaintext.length; //初始化子密钥 byte 数组 ; getSubKey(); //进行加 encrypt(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } //实现密文 //密文 byte 数组 , 密钥字符串参数传递 ; result=a; mainKey=b; //顺序初始化 S 盒 ; makeBox(); try{ //初始化本对 length=result.length; //初始化子密钥 byte 数组 ; getSubKey(); //进行解 decrypt(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } //初始化 S 盒内数据 box=new byte[256]; //用 00000000B 到 11111111B 的内容依次初始化 S 盒 ; //注意 byte 类型数据表示 0-255无符号数字的顺序 ; //00000000B(0)-01111111B(127)-10000000B(-128)-11111111B(-1) for(int i=0;i<> if(i<> box[i]=(byte)i; }else{ box[i]=(byte)(i-256); } } } //把明文改变为相应的 byte 数组的方法 ;**************************************** private void getBytePlaintext(){ bytePlaintext=plaintext.getBytes(); } //把 byte 数组恢 return new String(bytePlaintext); } //获得自密钥 //声明所需 int j=0,hold=0; byte temp=0; byte []key =mainKey.getBytes(); //通过 j for (int i=0; i<256;>256;> //j的混 j=(j+(box[i]>0?box[i]:(box[i]+256)) +(key[i%key.length]>0?key[i%key.length]:(key[i%key.length]+256)))%256; //空杯法换位 ; temp=box[i];box[i]=box[j];box[j]=temp; } int i=j=0; //声明一个容量等 subKey=new byte[length]; for(int k=0;k<> //遍历 i; i=++i%256; //j第二次 j=(j+(box[i]>0?box[i]:(box[i]+256)))%256; //空杯发换位 ; temp=box[i];box[i]=box[j];box[j]=temp; //子密钥 byte 数 subKey[k]=box[((box[i]>0?box[i]:(box[i]+256))+(box[j]>0?box[j]:(box[j]+256)))%256]; } } //加密计算方 result=new byte[length]; //明文 byte 组与子密钥 byte 数组 for(int i=0;i<> result[i]=(byte)(bytePlaintext[i]^subKey[i]); } } //解密计算方 bytePlaintext=new byte[length]; //密文 byte 组于子密钥 byte 数组 for(int i=0;i<> bytePlaintext[i]=(byte)(result[i]^subKey[i]); } } } //各 按 钮 的 监 听 器 的 实 例 模 板 类 ;============================================================ class B1_actionAdapter implements ActionListener { private RC4Frame adaptee; B1_actionAdapter(RC4Frame adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.b1_actionPerformed(e); } } class B2_actionAdapter implements ActionListener { private RC4Frame adaptee; B2_actionAdapter(RC4Frame adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.b2_actionPerformed(e); } } class B3_actionAdapter implements ActionListener { private RC4Frame adaptee; B3_actionAdapter(RC4Frame adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.b3_actionPerformed(e); } } class B4_actionAdapter implements ActionListener { private RC4Frame adaptee; B4_actionAdapter(RC4Frame adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.b4_actionPerformed(e); } } class B5_actionAdapter implements ActionListener { private RC4Frame adaptee; B5_actionAdapter(RC4Frame adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.b5_actionPerformed(e); } } class B6_actionAdapter implements ActionListener { private RC4Frame adaptee; B6_actionAdapter(RC4Frame adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.b6_actionPerformed(e); } } 凯撒加密算法 替代加密算法是将明中的每一个字符用另一个 者外,其他人不理其间的替代。接受者对 著名的凯撒加密算法是一种简单的替代加密 位并以26个字符为模替代(A由D代,B由E 代,Y由B替代,Z由C替代)。 维吉尼亚密码 人们在单一恺撒密码基础上扩展出多表密码, 纪法国亨利三世王朝的莱瑟?维吉亚发明的。 根据密钥来决定用哪一的密表来进替换,以此 间大小为26m,所以使m的值很,使用穷尽 当m=5时,密钥空间大超过1.1*107,这样 能力范围。 将26个恺撒密表合成 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A -A B C D E F G H I J K L M N O P Q R S T U V W X Y Z B -B C D E F G H I J K L M N O P Q R S T U V W X Y Z A C-C D E F G H I J K L M N O P Q R S T U V W X Y Z A B D- D E F G H I J K L M N O P Q R S T U V W X Y Z A B C E -E F G H I J K L M N O P Q R S T U V W X Y Z A B C D F -F G H I J K L M N O P Q R S T U V W X Y Z A B C D E G- G H I J K L M N O P Q R S T U V W X Y Z A B C D E F H -H I J K L M N O P Q R S T U V W X Y Z A B C D E F G I- I J K L M N O P Q R S T U V W X Y Z A B C D E F G H J -J K L M N O P Q R S T U V W X Y Z A B C D E F G H I K -K L M N O P Q R S T U V W X Y Z A B C D E F G H I J L -L M N O P Q R S T U V W X Y Z A B C D E F G H I J K M -M N O P Q R S T U V W X Y Z A B C D E F G H I J K L N -N O P Q R S T U V W X Y Z A B C D E F G H I J K L M O -O P Q R S T U V W X Y Z A B C D E F G H I J K L M N P -P Q R S T U V W X Y Z A B C D E F G H I J K L M N O Q -Q R S T U V W X Y Z A B C D E F G H I J K L M N O P R -R S T U V W X Y Z A B C D E F G H I J K L M N O P Q S -S T U V W X Y Z A B C D E F G H I J K L M N O P Q R T -T U V W X Y Z A B C D E F G H I J K L M N O P Q R S U -U V W X Y Z A B C D E F G H I J K L M N O P Q R S T V -V W X Y Z A B C D E F G H I J K L M N O P Q R S T U W -W X Y Z A B C D E F G H I J K L M N O P Q R S T U V X -X Y Z A B C D E F G H I J K L M N O P Q R S T U V W Y -Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Z -Z A B C D E F G H I J K L M N O P Q R S T U V W X Y 加密方法 维吉尼亚密码引了“密钥”的概念,即 行替换,以此来对字频统计。假如以上面 表密钥字母,对如 TO BE OR NOT TO BE THAT IS THE QUESTION 当选定RELATIONS作为密钥时,加 密钥字母为R,因可以找到在R行中代替T 如下: 密钥:RELAT IONSR ELATI ONSRE LATIO NSREL 明文:TOBEO RNOTT OBETH ATIST HEQUE STION 密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY 历史上以维吉亚密表为基础又演变出 密表与密钥,并直沿用到二战以 公元16世纪期,想要获得更高的保 密码表。 密码技术实验(恺撒 #include "string.h" #include "ctype.h" #include "stdlib.h" #define N 50 void menu();/*显示菜单*/ char * inputPandK();/*输入明文和密钥*/ void caesar();/*恺撒加密算法*/ void vigenere();/*维吉尼亚加密算法*/ int main() { menu(); system("PAUSE"); return 0; } void menu() { int i=0; printf(" Clssical encrption program: \n"); printf("****0-----------EXIT **** \n"); printf("****1-----------Keasar **** \n"); printf("****2-----------Vigenere **** \n"); printf("******************************* \n"); printf("Choose your option: "); scanf("%d",&i); switch(i) { case 0: break; case 1: caesar(); break; case 2: vigenere(); break; default:break; } } //输入明 char* inputPandK() { char * plntxt;//声明一个明文指针类型 int i = 0,choose = 0; //开 plntxt = (char *)malloc(N * sizeof(char)); if(plntxt == NULL) { printf("Memory location failed!"); exit(-1); } /*输 printf("****Enter plaintext: \n"); fflush(stdin); while(i < n)=""> { plntxt[i] = getchar(); //如果输不合法,跳出循 if(plntxt[i] > 126 || plntxt[i] < 32)=""> { plntxt[i] = '\0'; break; } else i++; } //返回该 return plntxt; } void caesar() { char* _plntxt;//明文指针 int* _cphrtxt;//密文指针 unsigned int i,j; unsigned char key = 0; //接收明文 _plntxt = inputPandK(); printf("Enter the key:"); scanf("%c",&key); while(!isdigit(key)) { //key = 0; printf("Your input is error! \n"); printf("Enter the key again: \n"); scanf("%c",&key); } _cphrtxt = (int *)malloc(N * sizeof(int)); if(_cphrtxt == NULL) { printf("Memory location failed!"); exit(-1); } //keasar加密算法 for(i = 0;i < strlen(_plntxt);i++)=""> { if(_plntxt[i] >= 'A' && _plntxt[i] <= 'z')="">=> //直接 _cphrtxt[i] = (_plntxt[i]%'A' + key)%26 + 'a'; else if(_plntxt[i] >= 'a' && _plntxt[i] <= 122)="">=> //直接 _cphrtxt[i] = (_plntxt[i]%'a' + key)%26 + 'A'; else //如果为其他 _cphrtxt[i] = _plntxt[i]; } // printf("The ciphertext is :"); for(j = 0;j <= i;j++)="">=> printf("%c",_cphrtxt[j]); free(_plntxt); free(_cphrtxt); } void vigenere() { char* _plntxt; int* _cphrtxt; char* key; unsigned int i = 0,j; //开辟密钥,密文空间 key = (char *)malloc(N * sizeof(char)); if(key == NULL) { printf("Memory location failed!"); exit(-1); } _cphrtxt = (int *)malloc(N * sizeof(int)); if(_cphrtxt == NULL) { printf("Memory location failed!"); exit(-1); } // _plntxt = inputPandK(); printf("Enter the key: \n"); fflush(stdin); while(i < n)=""> { // key[i%strlen(key)] = getchar(); if(key[i%strlen(key)] > 126 || key[i%strlen(key)] < 32)=""> { key[i%strlen(key)] = '\0'; break; } else i++; } for(i = 0;i < strlen(_plntxt);i++)=""> { //密 if(key[i%strlen(key)] >= 'A' && key[i%strlen(key)] <= 'z')="">=> { // if(_plntxt[i] >= 'A' && _plntxt[i] <= 'z')="">=> _cphrtxt[i] = (key[i%strlen(key)]-'A' + _plntxt[i]-'A')%26 + 'a'; //明 else if(_plntxt[i] >= 'a' && _plntxt[i] <= 'z')="">=> _cphrtxt[i] = (key[i%strlen(key)]-'A' + _plntxt[i]-'a')%26 + 'A'; } //密 if(key[i%strlen(key)] >= 'a' && key[i%strlen(key)] <= 'z')="">=> { //明 if(_plntxt[i] >= 'A' && _plntxt[i] <= 'z')="">=> _cphrtxt[i] = (key[i%strlen(key)]-'a' + _plntxt[i]-'A')%26 + 'a'; //明文 if(_plntxt[i] >= 'a' && _plntxt[i] <= 'z')="">=> _cphrtxt[i] = (key[i%strlen(key)]-'a' + _plntxt[i]-'a')%26 + 'A'; } //如果为其他字 if(key[i%strlen(key)] < 'a'="" ||="" ((key[i%strlen(key)]=""> 'Z' && key[i%strlen(key)] < 'a'))="" ||=""> key[i%strlen(key)] > 'z') _cphrtxt[i] = _plntxt[i]; } //屏幕 printf("The ciphertext is :"); for(j = 0;j <= i;j++)="">=> printf("%c",_cphrtxt[j]); free(_plntxt); free(_cphrtxt); free(key); } package com.caesar; public class Crypto { // 初始化一个26*26的char类型数组,存放密码原本 public char[][] crypto = new char[26][26]; // 初始化crypto和计算原始message各个符的位置的初始信息。 public char[] initWord = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; public static void main(String[] args) { } // 初始换偏移量,最值不大于25(可以自定义修改) int[] offsets = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }; Crypto c = new Crypto(offsets); String message = "I have lots of swag"; String res1 = c.encrypt(message, 5); String res2 = c.doubleEncrypt(message, 5); System.out.println("加密前的字符串:"+message); System.out.println("行加密后的字符串:"+res1); System.out.println("加密后的字符串:"+res2); // 构造方法初始码原本,对crypto赋值,offsets数组指在初始化时每行的量 public Crypto(int[] offsets) { // 第一种初始化方式,利用unicode编码转换,A-Z对数字65-90 // 外循,表示数 } /*for (int row = 0; row = 26) { index = index - 26; } crypto[row][col] = initWord[index]; } }*/ // 输 // 返回一行 public char[] getCaesarCipher(int row) { return crypto[row]; // crypto的每一行都是一个数组 } // 返回一列 public char[] getDoubleCaesarCipher(int col) { char[] temp = new char[26]; for (int row = 0; row temp[row] = crypto[row][col]; } return temp; } // 以行 public String encrypt(String message, int row) { char[] tempCaesar = getCaesarCipher(row); // 作为编码原本的数组 char[] messageArr = message.toUpperCase().toCharArray();// 将要加 int[] index = new int[messageArr.length]; // 存放原字符各个字符的位置 for (int i = 0; i if (messageArr[i] == ' ') { // 如果空格,不做比,续下个字符,字符类型数据可直 index[i] = -1; // 空格的位置用-1标出 continue; } if (messageArr[i] == initWord[j]) { } index[i] = j; // 记录每个字的位 // 以列 public String doubleEncrypt(String message, int col) { char[] tempCaesar = getDoubleCaesarCipher(col); // 作为编码原本的数组 char[] messageArr = message.toUpperCase().toCharArray();// 将要加 char[] messageRes = new char[messageArr.length];// 存放加密后的字符 int[] index = new int[messageArr.length]; // 存放原字符各个字符的位置 for (int i = 0; i for (int j = 0; j if (messageArr[i] == ' ') { // 如果空格,不做比,续下个字符,字符类型数据可直 index[i] = -1; // 空格的位置用-1标出 continue; } if (messageArr[i] == initWord[j]) { index[i] = j; // 记录每个字符的位置 } } } for (int i = 0, j = 0; i messageRes[j] = ' '; // 如果是-1,表示是空格 } } return new String(messageRes); } } 新建任意java项目, 即可。 com.caesar,新建类Crypto.java,将上边的代码拷入凯撒加密算法
凯撒加密算法
凯撒密码加密算法