zoukankan      html  css  js  c++  java
  • 加密算法

             现在看看大家都用异或,感觉简单了点,没有创新。来一个新型的加密算法。

          先说说思路:加密的时候是先用一个密码产生随机数列,随机把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


  • 相关阅读:
    AcWing 2476. 树套树(线段树套splay)
    LeetCode 1191 K 次串联后最大子数组之和
    LeetCode 668 乘法表中第k小的数
    Java003-String字符串
    云原生CD工具spinnaker部署(容器化灰度发布)
    刷题日记
    8.22 校内模拟赛 题解报告
    关于 CDQ分治(复习)
    解题营_数论
    解题营_动规
  • 原文地址:https://www.cnblogs.com/iyangyuan/p/2801890.html
Copyright © 2011-2022 走看看