Board logo

标题: [原创代码] 德国的enigma加密技术例子 - JavaScript [打印本页]

作者: yu2n    时间: 2013-2-4 04:10     标题: 德国的enigma加密技术例子 - JavaScript

本帖最后由 yu2n 于 2013-2-7 05:59 编辑

作者:yu2n【原创】

EnigmaEncrypt 函数说明:

strSRC 待加密字符串
strKEY 密钥
strMatrix 矩阵字符串

主程序代码:
  1. function EnigmaEncrypt(strSRC, strKEY, strMatrix)
  2. {
  3.     // 默认按ANSI码表(33~126)生成矩阵字符串,忽略空格 String.fromCharCode(32)
  4.     if (strMatrix == "")
  5.     {
  6.         for (var i=33; i <= "~".charCodeAt(0); i++)
  7.         {
  8.             strMatrix = strMatrix + String.fromCharCode(i);
  9.         };
  10.     };
  11.    
  12.     // 根据矩阵字符串生成依次缩进1位的矩阵数组
  13.     var LenMatrix = strMatrix.length;
  14.     var arrCryptMatrix = new Array();
  15.     arrCryptMatrix[0] = strMatrix;
  16.     for (var i=0, j=1; i<LenMatrix-1; i++, j++)
  17.     {
  18.         var mov1 = arrCryptMatrix[i].substr(1, LenMatrix-1)
  19.         var mov2 = arrCryptMatrix[i].charAt(0);
  20.         arrCryptMatrix[j] = mov1 + mov2;
  21.     }
  22.    
  23.     // 根据加密密钥查找矩阵数组,找到输入字符对应的字符
  24.     var LenSRC = strSRC.length;
  25.     var LenKEY = strKEY.length;
  26.     var EncryptedString = "";
  27.     for (var i=0, j=0; i<LenSRC; i++)
  28.     {
  29.         // 按密钥长度循环
  30.         if (j >= LenKEY){j=0;};
  31.         
  32.         // 在矩阵中找出对应字符
  33.         var C2E = strSRC.charAt(i);
  34.         var MP = strMatrix.indexOf(C2E,0);
  35.         var CWL = strKEY.charAt(j);
  36.         if (MP == -1){
  37.             // 跳过矩阵表中不存在的字符,并重置起始编码
  38.             EncryptedString += C2E; j=0;
  39.         } else {
  40.             // 密钥字符串,右移一位
  41.             j++;
  42.             // 在矩阵中查找对应字符
  43.             for (var m=0; m<LenMatrix; m++)
  44.             {
  45.                 if (arrCryptMatrix[m].charAt(MP) == CWL){
  46.                     EncryptedString += arrCryptMatrix[m].charAt(0); break;
  47.                 }
  48.             };
  49.         }
  50.     }
  51.    
  52.     return EncryptedString;
  53. }
复制代码
加密实例:
1. 加密前:
  1.         // 按ANSI码表(33~126)生成矩阵字符串
  2.         var Matrix = "";
  3.         for (var i=33; i <= "~".charCodeAt(0); i++)
  4.         {
  5.             Matrix = Matrix + String.fromCharCode(i);
  6.         }
复制代码
2. 加密后:
  1.         kg 按YH^F码表rc~oid{f生成矩阵字符串
  2.         $5? M5={1| ] xtv
  3.         4'? r~P{ 1Y~\_ 1 ^Y xv1a7.P{W'M*Y"+_q[ 1k(f
  4.         }
  5.             M5={1| ] M5={1| o G"?&,/%)('DL25?L+2Lg1mv
  6.         {
复制代码

作者: yu2n    时间: 2013-2-4 04:13

另发一个VBS版本,来至网络上的VB代码
  1. ' ====================================================================================================
  2. '德国的enigma加密类
  3. ' Download by http://www.codefans.net,yu2n 改写为VBS
  4. ' 使用:
  5. ' Msgbox GetEnigmaEncrypt("123456", "KATHER")
  6. Function GetEnigmaEncrypt( byVal EncryptStr, byVal KeyStr )
  7.     Set MyEncrypt = New EnigmaEncrypt
  8.     MyEncrypt.KeyString = ( KeyStr )   ' 初始密钥(6个字母,如"KATHER")
  9.     GetEnigmaEncrypt = MyEncrypt.Encrypt( EncryptStr )
  10. End Function
  11. Class EnigmaEncrypt
  12.     Private LCW 'As Integer                'Length of CodeWord
  13.     Private LS2E 'As Integer               'Length of String to be Encrypted
  14.     Private LAM 'As Integer                'Length of Array Matrix
  15.     Private MP 'As Integer                 'Matrix Position
  16.     Private Matrix 'As String              'Starting Matrix
  17.     Private mov1 'As String                'First Part of Replacement String
  18.     Private mov2 'As String                'Second Part of Replacement String
  19.     Private CodeWord 'As String            'CodeWord
  20.     Private CWL 'As String                 'CodeWord Letter
  21.     Private EncryptedString 'As String     'String to Return for Encrypt or String to UnEncrypt for UnEncrypt
  22.     Private EncryptedLetter 'As String     'Storage Variable for Character just Encrypted
  23.     Private strCryptMatrix() 'As String    'yu2n 2013-1-28 生成动态数组 strCryptMatrix(LAM)
  24.     'Private strCryptMatrix(97) 'As String 'Matrix Array
  25.     Public Property Let KeyString(sKeyString) 'As String)
  26.         CodeWord = sKeyString
  27.     End Property
  28.     Public Function Encrypt(mstext) 'As String) As String
  29.         Dim X 'As Integer                    ' Loop Counter
  30.         Dim Y 'As Integer                    'Loop Counter
  31.         Dim Z 'As Integer                     'Loop Counter
  32.         Dim C2E 'As String                   'Character to Encrypt
  33.         Dim Str2Encrypt 'As String        'Text from TextBox
  34.         Str2Encrypt = mstext
  35.         LS2E = Len(mstext)
  36.         LCW = Len(CodeWord)
  37.         EncryptedLetter = ""
  38.         EncryptedString = ""
  39.         Y = 1
  40.         For X = 1 To LS2E
  41.             C2E = Mid(Str2Encrypt, X, 1)
  42.             MP = InStr(1, Matrix, C2E, 0)
  43.             CWL = Mid(CodeWord, Y, 1)
  44.             For Z = 1 To LAM
  45.                 If Mid(strCryptMatrix(Z), MP, 1) = CWL Then
  46.                     EncryptedLetter = Left(strCryptMatrix(Z), 1)
  47.                     EncryptedString = EncryptedString + EncryptedLetter
  48.                     Exit For
  49.                 End If
  50.             Next 'Z
  51.             Y = Y + 1
  52.             If Y > LCW Then Y = 1
  53.         Next 'X
  54.         Encrypt = EncryptedString
  55.     End Function
  56.    
  57.     Private Sub Class_Initialize()
  58.         Dim W 'As Integer     'Loop Counter to set up Matrix
  59.         Dim X 'As Integer     'Loop through Matrix
  60.         Dim I 'As Integer     ' 生成ANSCII码
  61.         'yu2n 2013-1-11 按ANSI码表(32~126)生成母字符串
  62.         For I = Asc(Chr(32)) To Asc(Chr(126))
  63.             Matrix = Matrix + Chr(I)
  64.         Next
  65.         'yu2n 2013-1-28 写入 .ini 文件时去掉空格与[]符号
  66.         'Matrix = Replace(Matrix, "[", "", 1, -1, 1) : Matrix = Replace(Matrix, "]", "", 1, -1, 1)
  67.         
  68.         'Matrix = "8x3p5BeabcdfghijklmnoqrstuvwyzACDEFGHIJKLMNOPQRSTUVWXYZ 1246790-.#/\!@$<>&*()[]{}';:,?=+~`^|%_"
  69.         'Matrix = Matrix + Chr(13)  'Add Carriage Return to Matrix
  70.         'Matrix = Matrix + Chr(10)  'Add Line Feed to Matrix
  71.         'Matrix = Matrix + Chr(34)  'Add "
  72.         ' Unique String used to make Matrix - 8x3p5Be
  73.         ' Unique String can be any combination that has a character only ONCE.
  74.         ' EACH Letter in the Matrix is Input ONLY once.
  75.         
  76.         W = 1
  77.         'yu2n 2013-1-28 生成动态数组 strCryptMatrix(LAM)
  78.         LAM = Len(Matrix) : ReDim Preserve strCryptMatrix(LAM) : strCryptMatrix(1) = Matrix
  79.         
  80.         For X = 2 To LAM ' LAM = Length of Array Matrix
  81.             mov1 = Left(strCryptMatrix(W), 1)   'First Character of strCryptMatrix
  82.             mov2 = Right(strCryptMatrix(W), (LAM - 1))   'All but First Character of strCryptMatrix
  83.             strCryptMatrix(X) = mov2 & mov1  'Makes up each row of the Array
  84.             W = W + 1
  85.         Next 'X
  86.         
  87.     End Sub
  88. End Class
复制代码

作者: BAT-VBS    时间: 2013-2-4 13:14

感谢分享
作者: yu2n    时间: 2013-3-23 12:00

本帖最后由 yu2n 于 2013-3-23 12:12 编辑
更新 ver 1.1  2013/03/23

在线体验:http://yu2n.tk/app/format/EnigmaEncoding.html
另存为HTA,有惊喜。
  1. // 德国 Enigma Encrypt 加密技术
  2. function EnigmaEncrypt(strSRC, strMatrix, strKEY)
  3. {
  4.     // 检测输入的参数,必须全部为字符串
  5.     if (!(strSRC.constructor == String && strMatrix.constructor == String
  6.             && strKEY.constructor == String)){return('args error!');};
  7.      
  8.     // 默认密钥字符串 Key
  9.     if (strKEY == ''){strKEY = 'Fishing';};
  10.    
  11.     // 密钥加盐更安全 salt
  12.     var salt = 'WoYeBuxiangJiayanA!ShangyeGongsiTaiKengdie!!!';
  13.     strKEY += salt;
  14. // 默认的矩阵字符串 Matrix
  15.     if (strMatrix.length == 0){
  16.         // 按ANSI码表(33~126)生成矩阵字符串,忽略空格 String.fromCharCode(32)
  17.         for (var i=33; i <= '~'.charCodeAt(0); i++)
  18.         {
  19.             strMatrix += String.fromCharCode(i);
  20.         }
  21.     }
  22.    
  23.     // 根据矩阵字符串生成依次缩进1位的矩阵数组
  24.     var LenMatrix = strMatrix.length;
  25.     var arrMatrix = new Array();
  26.         arrMatrix[0] = strMatrix;
  27.     for (var i=0, j=1; i<LenMatrix-1; i++, j++)
  28.     {
  29.         var mov1 = arrMatrix[i].substr(1, LenMatrix-1)     // 读取‘当前数组元素’,截取除‘第一个字符’以外的所有字符
  30.         var mov2 = arrMatrix[i].charAt(0);     // 截取第一个字符,然后拼接至末尾,保存到‘下一个数组元素’
  31.         arrMatrix[j] = mov1 + mov2;
  32.     }
  33. // 根据加密密钥查找矩阵数组,找到输入字符对应的字符
  34. var LenSRC = strSRC.length;     // 原字符串长度
  35. var LenKEY = strKEY.length;     // 密钥长度
  36. var EncryptedString = '';       // 加密后的字符串
  37. for (var i=0, j=0; i<LenSRC; i++)
  38. {
  39. // 按密钥长度循环,超出长度重新开始
  40. if (j >= LenKEY){j=0;};
  41.         
  42.         // 换行重新开始
  43.         if (strSRC.charAt(i)=='\r'){j=0;};
  44. if (strSRC.charAt(i)=='\n'){j=0;};
  45.         
  46. // 在矩阵中找出对应字符
  47.         var charKEY = strKEY.charAt(j);                     // 当前‘密钥截取字符’
  48. var charSRC = strSRC.charAt(i);                     // 当前‘原字符串截取字符’
  49. var MatrixPos = strMatrix.indexOf(charSRC,0);       // 当前‘原字符串截取字符’在‘矩阵字符串’中的位置
  50.         
  51.         // 跳过矩阵表中不存在(位置返回-1)的字符
  52. if (MatrixPos == -1){
  53. EncryptedString += charSRC;
  54. } else {
  55. // 密钥字符串,右移一位
  56. j++;
  57. // 在矩阵中查找对用字符
  58. for (var m=0; m<LenMatrix; m++)
  59. {
  60. if (arrMatrix[m].charAt(MatrixPos) == charKEY){
  61. EncryptedString += arrMatrix[m].charAt(0); break;
  62. }
  63. };
  64. }
  65. }
  66. return(EncryptedString);
  67. }
复制代码
题外话,汉字有多少个?
  1.         // 生成汉字码表 从 \u4e00 至 \u0x9fa5
  2.         var strMatrix='';
  3.         for(var i=parseInt(0x4e00,10); i<parseInt(0x9fa5,10); i++){
  4.             strMatrix += String.fromCharCode(i);
  5.         }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2