算法基础——2.6加密与解密

例一:简单加密

[java] view plain copy
  1. publicclassA
  2. {
  3. staticvoidmain(String[]args)throwsException
  4. Strings="我们abc";
  5. Stringkey="xyz";
  6. byte[]key_buf=key.getBytes("utf-8");
  7. //加密
  8. byte[]buf=s.getBytes("utf-8");
  9. for(inti=0;i<buf.length;i++){
  10. buf[i]^=key_buf[i%key_buf.length];
  11. }
  12. //解密
  13. 0;i<buf.length;i++){
  14. buf[i]^=key_buf[i%key_buf.length];
  15. }
  16. System.out.println(newString(buf,"utf-8"));
  17. }

例二:完整简单加密

    classSimple
  1. //buf中的byte每个都转为16进制的串的表述形式
  2. staticStringbyteToAF(byte[]buf)
  3. {
  4. StringBuffersb=newStringBuffer();
  5. sb.append(String.format("%02X",buf[i]));
  6. returnsb.toString();
  7. //用16进制串形式表达的byte,转换为byte数组
  8. byte[]AFtoByte(Strings)
  9. byte[]out=newbyte[s.length()/2];
  10. 0;i<s.length();i+=2){
  11. out[i/2]=(byte)(Character.getNumericValue(s.charAt(i))*16
  12. +Character.getNumericValue(s.charAt(i+1)));
  13. returnout;
  14. //加密过程
  15. staticStringencrypt(Stringsrc,Stringkey)
  16. if(key.length()<1)returnnull;
  17. try{
  18. byte[]buf_txt=src.getBytes("utf-8");
  19. byte[]buf_key=key.getBytes("utf-8");
  20. 0;i<buf_txt.length;i++){
  21. buf_txt[i]^=buf_key[i%buf_key.length];
  22. returnbyteToAF(buf_txt);
  23. catch(Exceptione){
  24. e.printStackTrace();
  25. null;
  26. //解密过程
  27. staticStringdecrypt(Stringsrc,Stringkey)
  28. try{
  29. byte[]buf_txt=AFtoByte(src);
  30. byte[]buf_key=key.getBytes("utf-8");
  31. 0;i<buf_txt.length;i++){
  32. buf_txt[i]^=buf_key[i%buf_key.length];
  33. newString(buf_txt,"utf-8");
  34. catch(Exceptione){
  35. e.printStackTrace();
  36. voidmain(String[]args)
  37. Strings=encrypt("我们ab","xyz");
  38. System.out.println(s);
  39. Strings2=decrypt(s,"xyz");
  40. System.out.println(s2);
  41. }

例三:AES加密

    importjavax.crypto.*;
  1. importjavax.crypto.spec.*;
  2. importjava.security.*;
  3. importsun.misc.BASE64Decoder;
  4. importsun.misc.BASE64Encoder;
  5. classAES
  6. //处理密钥
  7. byte[]bKey=pwd.getBytes("utf-8");
  8. byte[]buf=byte[16];//创建一个空的16位字节数组(默认值为0)
  9. 0;i<bKey.length&&i<buf.length;i++){
  10. buf[i]=bKey[i];
  11. SecretKeySpeckey=newSecretKeySpec(buf,"AES");
  12. Ciphercipher=Cipher.getInstance("AES");//创建密码器
  13. cipher.init(Cipher.ENCRYPT_MODE,key);
  14. byte[]out=cipher.doFinal(src.getBytes("utf-8"));
  15. //转为串
  16. newBASE64Encoder().encode(out);
  17. return"";
  18. //处理密钥
  19. byte[]bKey=pwd.getBytes("utf-8");
  20. //创建一个空的16位字节数组(默认值为0)
  21. 0;i<bKey.length&&i<buf.length;i++){
  22. buf[i]=bKey[i];
  23. SecretKeySpeckey="AES");
  24. //密文还原为byte[]
  25. buf=newBASE64Decoder().decodeBuffer(src);
  26. cipher.init(Cipher.DECRYPT_MODE,153); background-color:inherit; font-weight:bold">byte[]out=cipher.doFinal(buf);
  27. newString(out,"utf-8");
  28. Strings="1中国人abc";
  29. Strings2=encrypt(s,"xyz1");
  30. Strings3=decrypt(s2,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> System.out.println(s3);
  31. }

例四:

    /*设计程序
  1. 一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下:
  2. 1.首先按行填入密钥串。
  3. 2.紧接其后,按字母序按行填入不在密钥串中的字母。
  4. 3.由于方阵中只有25个位置,最后剩下的那个字母则不需变换。
  5. 如果密钥为youandme,则该方阵如下:
  6. youan
  7. dmebc
  8. fghij
  9. klpqr
  10. stvwx
  11. 在加密一对字母时,如am,在方阵中找到以这两个字母为顶点的矩形(红色字体):
  12. 这对字母的加密字母为该矩形的另一对顶点,如本例中为ob。
  13. 请设计程序,使用上述方法对输入串进行加密,并输出加密后的串。
  14. 另外有如下规定:
  15. 1、一对一对取字母,如果最后只剩下一个字母,则不变换,直接放入加密串中;
  16. 2、如果一对字母中的两个字母相同,则不变换,直接放入加密串中;
  17. 3、如果一对字母中有一个字母不在正方形中,则不变换,直接放入加密串中;
  18. 4、如果字母对出现在方阵中的同一行或同一列,如df或hi,则只需简单对调这两个字母,即变换为fd或ih;
  19. 5、如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为am,则该矩形的另一对顶点字母中,与a同行的字母应在前面,在上例中应是ob;同样若待变换的字母对为ta,则变换后的字母对应为wo;
  20. 6、本程序中输入串均为小写字母,并不含标点、空格或其它字符。
  21. 解密方法与加密相同,即对加密后的字符串再加密,将得到原始串。
  22. 要求输入形式如下:
  23. 从控制台输入两行字符串,第一行为密钥单词(长度小于等于25),第二行为待加密字符串(长度小于等于50),两行字符串末尾都有一个回车换行符,并且两行字符串均为小写字母,不含其它字符。
  24. 在标准输出上输出加密后的字符串。
  25. 例如,若输入:
  26. youandme
  27. welcometohangzhou
  28. 则表示输入的密钥单词为youandme,形成的正方形如上所示;待加密字符串为welcometohangzhou。在正方形中可以找到以第一对字母we为顶点的矩形,对应另一对顶点字母为vb,因此加密后为vb,同理可找到与字母对lc,et,oh,ho对应的顶点字母对。而字母对om位于上述正方形中的同一列,所以直接以颠倒这两个字母来加密,即为mo,字母对an同理。字母对gz中的z不在上述正方形中,因此原样放到加密串中。最后剩一个字母u也原样输出。
  29. 因此输出的结果为:
  30. vbrmmomvugnagzguu*/
  31. classC6{
  32. char[][]key=char[5][5];//5x5的方阵
  33. int[]alp=int[26];//字母表,表示26个字母是否已经出现,-1表示没有出现过,i>-1表示已经出现,i/5为在方阵的横坐标,i%5为在方阵的纵坐标
  34. //将密匙转化为5x5的方阵
  35. voidchange(char[]ckey){
  36. 0;i<26;++i)//字母表初始化
  37. alp[i]=-1;
  38. //按行填入密钥串
  39. intix=0;ix<ckey.length;++ix){
  40. key[ix/5][ix%5]=ckey[ix];
  41. switch(ckey[ix]){//密钥中出现的字母,置为true
  42. case'a':
  43. alp['a'-'a']=ix;
  44. break;
  45. case'b':
  46. alp['b'-'a']=ix;
  47. break;
  48. case'c':
  49. alp['c'-'a']=ix;
  50. case'd':
  51. alp['d'-'a']=ix;
  52. case'e':
  53. alp['e'-'a']=ix;
  54. case'f':
  55. alp['f'-'a']=ix;
  56. case'g':
  57. alp['g'-'a']=ix;
  58. case'h':
  59. alp['h'-'a']=ix;
  60. case'i':
  61. alp['i'-'a']=ix;
  62. case'j':
  63. alp['j'-'a']=ix;
  64. case'k':
  65. alp['k'-'a']=ix;
  66. case'l':
  67. alp['l'-'a']=ix;
  68. case'm':
  69. alp['m'-'a']=ix;
  70. case'n':
  71. alp['n'-'a']=ix;
  72. case'o':
  73. alp['o'-'a']=ix;
  74. case'p':
  75. alp['p'-'a']=ix;
  76. case'q':
  77. alp['q'-'a']=ix;
  78. case'r':
  79. alp['r'-'a']=ix;
  80. case's':
  81. alp['s'-'a']=ix;
  82. case't':
  83. alp['t'-'a']=ix;
  84. case'u':
  85. alp['u'-'a']=ix;
  86. case'v':
  87. alp['v'-'a']=ix;
  88. case'w':
  89. alp['w'-'a']=ix;
  90. case'x':
  91. alp['x'-'a']=ix;
  92. case'y':
  93. alp['y'-'a']=ix;
  94. case'z':
  95. alp['z'-'a']=ix;
  96. default:
  97. //紧接其后,按字母序按行填入不在密钥串中的字母
  98. intj=ckey.length,k=0;j<25&&k<26;++j,++k){
  99. //不在密钥串中的字母
  100. if(alp[k]==-1){
  101. key[j/5][j%5]=(char)(k+'a');
  102. alp[k]=j;
  103. }else{
  104. j--;
  105. //输出转化过的5*5的矩阵
  106. 5;++i){
  107. intj=5;++j){
  108. System.out.print(key[i][j]+"");
  109. System.out.println();
  110. //加密过程
  111. staticStringencrypt(Stringpair,Strings){
  112. char[]ckey=pair.toCharArray();//密匙
  113. change(ckey);//将密匙转化为5x5的方阵
  114. char[]c_s=s.toCharArray();
  115. //从待加密字符串取每对字母加密
  116. 1;i<c_s.length;i+=2){//1
  117. //2如果一对字母中的两个字母相同,则不变换,直接放入加密串中;3或一对字母中有一个字母不在正方形中时则不变换,直接放入加密串中
  118. if(c_s[i-1]==c_s[i]||(alp[c_s[i-1]-'a']==-1)||(alp[c_s[i]-'a']==-1))
  119. continue;
  120. //两个字母都在在正方形中且一对字母中的两个字母不同
  121. introw1=alp[c_s[i-1]-'a']/5;//一对字母中的第一个字母横坐标
  122. intclum1=alp[c_s[i-1]-'a']%//一对字母中的第一个字母纵坐标
  123. introw2=alp[c_s[i]-'a']///一对字母中的第二个字母横坐标
  124. intclum2=alp[c_s[i]-'a']%//一对字母中的第二个字母纵坐标
  125. if(row1==row2||clum1==clum2){//4如果字母对出现在方阵中的同一行或同一列,如df或hi,则只需简单对调这两个字母
  126. chartemp=c_s[i-1];
  127. c_s[i-1]=c_s[i];
  128. c_s[i]=temp;
  129. //5、如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为am,则该矩形的另一对顶点字母中,与a同行的字母应在前面,
  130. //在上例中应是ob;同样若待变换的字母对为ta,则变换后的字母对应为wo;
  131. else{
  132. 1]=key[row1][clum2];
  133. c_s[i]=key[row2][clum1];
  134. /*if(c_s.length%2==1&&i==c_s.length){
  135. break;
  136. }*/
  137. Strings2=newString(c_s);//存储加密过的字符串
  138. returns2;
  139. //解密过程
  140. staticStringdecrypt(Stringpair,Strings){
  141. //密匙
  142. change(ckey);voidmain(String[]args){
  143. Strings;//待加密字符串
  144. Stringpair; Scannerscan=newScanner(System.in);
  145. System.out.println("请输入两行字符串,第一行为密钥单词(长度小于等于25),第二行为待加密字符串(长度小于等于50):");
  146. pair=scan.nextLine();
  147. s=scan.nextLine();
  148. Strings2=encrypt(pair,s);
  149. Strings3=decrypt(pair,s2);
  150. System.out.println("加密过的字符串:");
  151. System.out.println(s2);
  152. System.out.println("解密过的字符串:");
  153. System.out.println(s3);
  154. }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jquery.validate使用攻略(表单校验) 目录 jquery.validate使用攻略1 第一章&#160;jquery.validate使用攻略1 第二章&#160;jQuery.validate.js API7 Custom selectors7 Utilities8 Validato
/\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢? 我们先来看下面一个例子: let name = &#39;ye wen jun&#39;;let ans = name.replace(/\s/g, &#39;&#3
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母 /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod(&quot;letters&quot;, function (value, element) { return this.optio
this.optional(element)的用法 this.optional(element)是jquery.validator.js表单验证框架中的一个函数,用于表单控件的值不为空时才触发验证。 简单来说,就是当表单控件值为空的时候不会进行表单校验,此函数会返回true,表示校验通过,当表单控件
jQuery.validate 表单动态验证 实际上jQuery.validate提供了动态校验的方法。而动态拼JSON串的方式是不支持动态校验的。牺牲jQuery.validate的性能优化可以实现(jQuery.validate的性能优化见图1.2 jQuery.validate源码 )。 也可
自定义验证之这能输入数字(包括小数 负数 ) &lt;script type=&quot;text/javascript&quot;&gt; function onlyNumber(obj){ //得到第一个字符是否为负号 var t = obj.value.charAt(0); //先把非数字的都
// 引入了外部的验证规则 import { validateAccountNumber } from &quot;@/utils/validate&quot;; validator.js /*是否合法IP地址*/ export function validateIP(rule, value,cal
VUE开发--表单验证(六十三) 一、常用验证方式 vue 中表单字段验证的写法和方式有多种,常用的验证方式有3种: data 中验证 表单内容: &lt;!-- 表单 --&gt; &lt;el-form ref=&quot;rulesForm&quot; :rules=&quot;formRul
正则表达式 座机的: 例子: 座机有效写法: 0316-8418331 (010)-67433539 (010)67433539 010-67433539 (0316)-8418331 (0316)8418331 正则表达式写法 0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d
var reg = /^0\.[1-9]{0,2}$/;var linka = 0.1;console.log (reg.test (linka)); 0到1两位小数正则 ^(0\.(0[1-9]|[1-9]{1,2}|[1-9]0)$)|^1$ 不含0、0.0、0.00 // 验证是否是[1-10
input最大长度限制问题 &lt;input type=&quot;text&quot; maxlength=&quot;5&quot; /&gt; //可以 &lt;input type=&quot;number&quot; maxlength=&quot;5&quot; /&gt; //没有效
js输入验证是否为空、是否为null、是否都是空格 目录 1.截头去尾 trim 2.截头去尾 会去掉开始和结束的空格,类似于trim 3.会去掉所有的空格,包括开始,结束,中间 1.截头去尾 trim str=str.trim(); // 强烈推荐 最常用、最实用 or $.trim(str);
正则表达式语法大全 字符串.match(正则):返回符合的字符串,若不满足返回null 字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1 字符串.replace(正则,新的字符串):找到符合正则的内容并替换 正则.test(字符串):在字符串中
正整数正则表达式正数的正则表达式(包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+\d)|0)$正数的正则表达式(不包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+
JS 正则验证 test() /*用途:检查输入手机号码是否正确输入:s:字符串返回:如果通过验证返回true,否则返回false /function checkMobile(s){var regu =/[1][3][0-9]{9}$/;var re = new RegExp(regu);if (r
请输入保留两位小数的销售价的正则: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ 1.只能输入英文 &lt;input type=&quot;text&quot; onkeyup=&quot;value
判断价格的正则表达式 价格的正则表达式 /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/; 1 解析:价格符合两种格式 ^ [1-9]\d*(.\d{1,2})?$ : 1-9 开头,后跟是 0-9,可以跟小数点,但小数点后要带上 1-2 位小数,类似 2,2
文章浏览阅读106次。这篇文章主要介绍了最实用的正则表达式整理,比如校验邮箱的正则,号码相关,数字相关等等,本文给大家列举的比较多,需要的朋友可以参考下。_/^(?:[1-9]d*)$/ 手机号
文章浏览阅读1.2k次。4、匹配中的==、an==、== an9、i9 == "9i"和99p==请注意下面这部分的作用,它在匹配中间内容的时候排除了说明:当html字符串如下时,可以匹配到两处,表示匹配的字符串不包含and且不包含空白字符。说明:在上面的正则表达式中,_gvim正则表达式匹配不包含某个字符串
文章浏览阅读897次。【代码】正则表达式匹配a标签的href。_auto.js 正则匹配herf