现在的位置: 首页 > 综合 > 正文

加密算法

2012年09月11日 ⁄ 综合 ⁄ 共 3123字 ⁄ 字号 评论关闭
         现在看看大家都用异或,感觉简单了点,没有创新。来一个新型的加密算法

      先说说思路:加密的时候是先用一个密码产生随机数列,随机把ASC码表打乱;然后把ASC码表放在一个数组里。把真实的字符换成ASC码,然后去数组里匹配,匹配成功后把这个数组的下表值转换成字符,接着再用一个密码产生随机数列,用来随机确定下表的位置(说明:加密后每组5个字符下表伪装算一个,其他的用随机数产生随机字符,用的是第二个密码),这样产生的乱码是原来字符的5倍,每五个一组,每组中有一个是记录数组下表的字符(位置不定)。至于解密,先要有密码把ASC码表重新排序,然后五个一组开始解,如果加密完字符长度为n,要产生n个随机数,其中每五次中的第一次是记录位置的,其他的用来填充。如果有了位置密码,就可以按照这个规律解出了。把位置的字符转换成ASC码当作下表带入数组,再把数组转换成字符,就完成了。

   听起来好像很复杂,但我也不知道这个算法究竟安全性有多高。没经验。

   希望大家多多与我交流!

代码:

 

'本模块只支持英文字符!其他的可以自己添加
'调用方法:jiami/jiemi(字符串,位置密码,asc码表密码)
'注:如果解密时的密码和加密时的不一样,无法解密
Public Function jiami(strjiamishuju As String, lngmima As Long, lngshuzumima As Long) As String
Dim i As Long, k As Long, l As Long
Dim Ceshi(1 To 122 - 65 + 1) As Long '根据产生随机数的个数定义数组
Dim Jishu1 As Long, Jishu2 As Long
Dim Temp As Long
Dim strone As String
Dim lngweizhi As Long
Dim strfanhuizhi As String
Dim Number As Long
Dim lngnew() As Long
'--------------------------------------------------------------------------打乱asc码------------------------------------------------------------------------------

For i = 65 To 122 '把要产生的数先放入下界是1,上界是你要产生多少个随机数的数组
  Jishu1 = Jishu1 + 1
  Ceshi(Jishu1) = i
Next i

Jishu2 = 1
ReDim lngnew(1 + 41 To Jishu1 + 41) As Long '方便计算
Randomize (Rnd(-1) * lngshuzumima)

For i = 1 To Jishu1 '遍历Ceshi数组
  Jishu2 = Jishu2 - 1
  Number = Int(Rnd * (Jishu1 - 1 + 1 + Jishu2)) + 1 '产生一个介于数组上界和下界之间的随机整数,以表示选中了哪个元素
  Temp = Ceshi(Jishu1 + Jishu2)   '把选中的元素与数组最后一个元素交换
  Ceshi(Jishu1 + Jishu2) = Ceshi(Number)
  Ceshi(Number) = Temp
  lngnew(i + 41) = Ceshi(Jishu1 + Jishu2)
Next i

Randomize (Rnd(-1) * lngmima)
For i = 1 To Len(strjiamishuju)  '产生随机位置,用数组下标伪装成字符,其他的位置用随机符号填充(五个为一组)
  strone = Mid(strjiamishuju, i, 1)
  For k = 42 To 99
     If Asc(strone) = lngnew(k) Then
         lngweizhi = Int(Rnd * 5 + 1)
             For l = 1 To 5
                If l = lngweizhi Then
                   strfanhuizhi = strfanhuizhi & Chr(k)
                Else
                   strfanhuizhi = strfanhuizhi & Chr(Int(Rnd * 94 + 33))
                End If
             Next l
     End If
  Next k
Next i
jiami = strfanhuizhi
End Function


Public Function jiemi(strjiemishuju As String, lngmima As Long, lngshuzumima As Long) As String
Dim i As Long
Dim lngjishu1 As Long, lngjishu2 As Long
Dim lngweizhi() As Long, lngsuijishu As Long
Dim lngnew() As Long
Dim strfanhuizhi As String
Dim Number As Long
Dim Ceshi(1 To 122 - 65 + 1) As Long '根据产生随机数的个数定义数组
Dim Jishu1 As Long, Jishu2 As Long
Dim Temp As Long


lngjishu1 = 1
'--------------------------------------------------------------------------解密asc码------------------------------------------------------------------------------
For i = 65 To 122 '把要产生的数先放入下界是1,上界是你要产生多少个(个数=14 - 7 + 1)随机数的数组
  Jishu1 = Jishu1 + 1
  Ceshi(Jishu1) = i
Next i

Jishu2 = 1
ReDim lngnew(1 + 41 To Jishu1 + 41) As Long '方便计算
Randomize (Rnd(-1) * lngshuzumima)

For i = 1 To Jishu1 '遍历Ceshi数组
  Jishu2 = Jishu2 - 1
  Number = Int(Rnd * (Jishu1 - 1 + 1 + Jishu2)) + 1 '产生一个介于数组上界和下界之间的随机整数,以表示选中了哪个元素
  Temp = Ceshi(Jishu1 + Jishu2)   '把选中的元素与数组最后一个元素交换
  Ceshi(Jishu1 + Jishu2) = Ceshi(Number)
  Ceshi(Number) = Temp
  lngnew(i + 41) = Ceshi(Jishu1 + Jishu2)
Next i
Randomize (Rnd(-1) * lngmima)
For i = 1 To Len(strjiemishuju) Step 1 '利用种子密码的固定数列找出位置
   lngsuijishu = Int(Rnd * 5 + 1)  '每五次(一组)出现一个位置,并且都是第一次出现(每组的第一个数)
   If i = lngjishu1 Then
      lngjishu2 = lngjishu2 + 1
      lngjishu1 = lngjishu1 + 5 '判断是否是位置随机数
      ReDim Preserve lngweizhi(1 To lngjishu2) As Long
      lngweizhi(lngjishu2) = lngsuijishu
   End If
Next i

lngjishu2 = 0
For i = 1 To Len(strjiemishuju) Step 5
  lngjishu2 = lngjishu2 + 1
  strfanhuizhi = strfanhuizhi & Chr(lngnew(Asc(Mid(strjiemishuju, lngweizhi(lngjishu2) + i - 1, 1))))  '利用随机位置和首位置(i)的关系,截取出伪装的下标符号,转成asc码再带人数组中,找出对应的真实asc码,再转换成字符就获得了真正的字符
Next i
jiemi = strfanhuizhi

End Function

【上篇】
【下篇】

抱歉!评论已关闭.