例一:简单加密
- publicclassA
- {
- staticvoidmain(String[]args)throwsException
- Strings="我们abc";
- Stringkey="xyz";
-
- byte[]key_buf=key.getBytes("utf-8");
-
- byte[]buf=s.getBytes("utf-8");
- for(inti=0;i<buf.length;i++){
- buf[i]^=key_buf[i%key_buf.length];
- }
- //解密
- 0;i<buf.length;i++){
- buf[i]^=key_buf[i%key_buf.length];
- }
-
- System.out.println(newString(buf,"utf-8"));
- }
例二:完整简单加密
classSimple
-
- staticStringbyteToAF(byte[]buf)
- {
- StringBuffersb=newStringBuffer();
- sb.append(String.format("%02X",buf[i]));
- returnsb.toString();
- //用16进制串形式表达的byte,转换为byte数组
- byte[]AFtoByte(Strings)
- byte[]out=newbyte[s.length()/2];
- 0;i<s.length();i+=2){
- out[i/2]=(byte)(Character.getNumericValue(s.charAt(i))*16
- +Character.getNumericValue(s.charAt(i+1)));
- returnout;
- //加密过程
- staticStringencrypt(Stringsrc,Stringkey)
- if(key.length()<1)returnnull;
- try{
- byte[]buf_txt=src.getBytes("utf-8");
- byte[]buf_key=key.getBytes("utf-8");
- 0;i<buf_txt.length;i++){
- buf_txt[i]^=buf_key[i%buf_key.length];
- returnbyteToAF(buf_txt);
- catch(Exceptione){
- e.printStackTrace();
- null;
- //解密过程
- staticStringdecrypt(Stringsrc,Stringkey)
- try{
- byte[]buf_txt=AFtoByte(src);
- byte[]buf_key=key.getBytes("utf-8");
- 0;i<buf_txt.length;i++){
- buf_txt[i]^=buf_key[i%buf_key.length];
- newString(buf_txt,"utf-8");
- catch(Exceptione){
- e.printStackTrace();
- voidmain(String[]args)
- Strings=encrypt("我们ab","xyz");
- System.out.println(s);
- Strings2=decrypt(s,"xyz");
- System.out.println(s2);
- }
例三:AES加密
importjavax.crypto.*;
- importjavax.crypto.spec.*;
- importjava.security.*;
- importsun.misc.BASE64Decoder;
- importsun.misc.BASE64Encoder;
- classAES
- //处理密钥
- byte[]bKey=pwd.getBytes("utf-8");
- byte[]buf=byte[16];
- 0;i<bKey.length&&i<buf.length;i++){
- buf[i]=bKey[i];
- SecretKeySpeckey=newSecretKeySpec(buf,"AES");
- Ciphercipher=Cipher.getInstance("AES");
- cipher.init(Cipher.ENCRYPT_MODE,key);
- byte[]out=cipher.doFinal(src.getBytes("utf-8"));
- //转为串
- newBASE64Encoder().encode(out);
- return"";
- //处理密钥
- byte[]bKey=pwd.getBytes("utf-8");
- //创建一个空的16位字节数组(默认值为0)
- 0;i<bKey.length&&i<buf.length;i++){
- buf[i]=bKey[i];
- SecretKeySpeckey="AES");
- //密文还原为byte[]
- buf=newBASE64Decoder().decodeBuffer(src);
- cipher.init(Cipher.DECRYPT_MODE,153); background-color:inherit; font-weight:bold">byte[]out=cipher.doFinal(buf);
- newString(out,"utf-8");
- Strings="1中国人abc";
- Strings2=encrypt(s,"xyz1");
- Strings3=decrypt(s2,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> System.out.println(s3);
- }
例四:
/*设计程序
- 一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下:
- 1.首先按行填入密钥串。
- 2.紧接其后,按字母序按行填入不在密钥串中的字母。
- 3.由于方阵中只有25个位置,最后剩下的那个字母则不需变换。
- 如果密钥为youandme,则该方阵如下:
- youan
- dmebc
- fghij
- klpqr
- stvwx
- 在加密一对字母时,如am,在方阵中找到以这两个字母为顶点的矩形(红色字体):
- 这对字母的加密字母为该矩形的另一对顶点,如本例中为ob。
- 请设计程序,使用上述方法对输入串进行加密,并输出加密后的串。
- 另外有如下规定:
- 1、一对一对取字母,如果最后只剩下一个字母,则不变换,直接放入加密串中;
- 2、如果一对字母中的两个字母相同,则不变换,直接放入加密串中;
- 3、如果一对字母中有一个字母不在正方形中,则不变换,直接放入加密串中;
- 4、如果字母对出现在方阵中的同一行或同一列,如df或hi,则只需简单对调这两个字母,即变换为fd或ih;
- 5、如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为am,则该矩形的另一对顶点字母中,与a同行的字母应在前面,在上例中应是ob;同样若待变换的字母对为ta,则变换后的字母对应为wo;
- 6、本程序中输入串均为小写字母,并不含标点、空格或其它字符。
- 解密方法与加密相同,即对加密后的字符串再加密,将得到原始串。
- 要求输入形式如下:
- 从控制台输入两行字符串,第一行为密钥单词(长度小于等于25),第二行为待加密字符串(长度小于等于50),两行字符串末尾都有一个回车换行符,并且两行字符串均为小写字母,不含其它字符。
- 在标准输出上输出加密后的字符串。
- 例如,若输入:
- youandme
- welcometohangzhou
- 则表示输入的密钥单词为youandme,形成的正方形如上所示;待加密字符串为welcometohangzhou。在正方形中可以找到以第一对字母we为顶点的矩形,对应另一对顶点字母为vb,因此加密后为vb,同理可找到与字母对lc,et,oh,ho对应的顶点字母对。而字母对om位于上述正方形中的同一列,所以直接以颠倒这两个字母来加密,即为mo,字母对an同理。字母对gz中的z不在上述正方形中,因此原样放到加密串中。最后剩一个字母u也原样输出。
- 因此输出的结果为:
- vbrmmomvugnagzguu*/
- classC6{
- char[][]key=char[5][5];
- int[]alp=int[26];
- //将密匙转化为5x5的方阵
- voidchange(char[]ckey){
- 0;i<26;++i)
- alp[i]=-1;
- //按行填入密钥串
- intix=0;ix<ckey.length;++ix){
- key[ix/5][ix%5]=ckey[ix];
- switch(ckey[ix]){
- case'a':
- alp['a'-'a']=ix;
- break;
- case'b':
- alp['b'-'a']=ix;
- break;
- case'c':
- alp['c'-'a']=ix;
- case'd':
- alp['d'-'a']=ix;
- case'e':
- alp['e'-'a']=ix;
- case'f':
- alp['f'-'a']=ix;
- case'g':
- alp['g'-'a']=ix;
- case'h':
- alp['h'-'a']=ix;
- case'i':
- alp['i'-'a']=ix;
- case'j':
- alp['j'-'a']=ix;
- case'k':
- alp['k'-'a']=ix;
- case'l':
- alp['l'-'a']=ix;
- case'm':
- alp['m'-'a']=ix;
- case'n':
- alp['n'-'a']=ix;
- case'o':
- alp['o'-'a']=ix;
- case'p':
- alp['p'-'a']=ix;
- case'q':
- alp['q'-'a']=ix;
- case'r':
- alp['r'-'a']=ix;
- case's':
- alp['s'-'a']=ix;
- case't':
- alp['t'-'a']=ix;
- case'u':
- alp['u'-'a']=ix;
- case'v':
- alp['v'-'a']=ix;
- case'w':
- alp['w'-'a']=ix;
- case'x':
- alp['x'-'a']=ix;
- case'y':
- alp['y'-'a']=ix;
- case'z':
- alp['z'-'a']=ix;
- default:
- //紧接其后,按字母序按行填入不在密钥串中的字母
- intj=ckey.length,k=0;j<25&&k<26;++j,++k){
- //不在密钥串中的字母
- if(alp[k]==-1){
- key[j/5][j%5]=(char)(k+'a');
- alp[k]=j;
- }else{
- j--;
- //输出转化过的5*5的矩阵
- 5;++i){
- intj=5;++j){
- System.out.print(key[i][j]+"");
- System.out.println();
- //加密过程
- staticStringencrypt(Stringpair,Strings){
- char[]ckey=pair.toCharArray();
- change(ckey);
- char[]c_s=s.toCharArray();
- //从待加密字符串取每对字母加密
- 1;i<c_s.length;i+=2){
- //2如果一对字母中的两个字母相同,则不变换,直接放入加密串中;3或一对字母中有一个字母不在正方形中时则不变换,直接放入加密串中
- if(c_s[i-1]==c_s[i]||(alp[c_s[i-1]-'a']==-1)||(alp[c_s[i]-'a']==-1))
- continue;
- //两个字母都在在正方形中且一对字母中的两个字母不同
- introw1=alp[c_s[i-1]-'a']/5;
- intclum1=alp[c_s[i-1]-'a']%//一对字母中的第一个字母纵坐标
- introw2=alp[c_s[i]-'a']///一对字母中的第二个字母横坐标
- intclum2=alp[c_s[i]-'a']%//一对字母中的第二个字母纵坐标
- if(row1==row2||clum1==clum2){
- chartemp=c_s[i-1];
- c_s[i-1]=c_s[i];
- c_s[i]=temp;
- //5、如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为am,则该矩形的另一对顶点字母中,与a同行的字母应在前面,
- //在上例中应是ob;同样若待变换的字母对为ta,则变换后的字母对应为wo;
- else{
- 1]=key[row1][clum2];
- c_s[i]=key[row2][clum1];
- /*if(c_s.length%2==1&&i==c_s.length){
- break;
- }*/
- Strings2=newString(c_s);
- returns2;
- //解密过程
- staticStringdecrypt(Stringpair,Strings){
- //密匙
- change(ckey);main(String[]args){
- Strings;
- Stringpair;
- System.out.println("请输入两行字符串,第一行为密钥单词(长度小于等于25),第二行为待加密字符串(长度小于等于50):");
- pair=scan.nextLine();
- s=scan.nextLine();
- Strings2=encrypt(pair,s);
- Strings3=decrypt(pair,s2);
- System.out.println("加密过的字符串:");
- System.out.println(s2);
- System.out.println("解密过的字符串:");
- System.out.println(s3);
- }
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|