鱼C论坛

 找回密码
 立即注册
查看: 2744|回复: 0

[作品展示] 分享一个自己做的模块

[复制链接]
发表于 2021-2-27 21:05:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 考不好不改名 于 2021-2-27 21:09 编辑

不废话,代码如下:
  1. # 文档
  2. '''
  3. - 这个模块的作者·SYZ·于·公元2021年2月27日·学习了密码学的相关知识后开始制作这个·用以加解密·的模块,并于·当天· 竣工* 。

  4. * 换字式密码部分开发存在困难,目前未竣工


  5. - 作者希望被使用的 接口* 如下:
  6.     - KaiSa(s, n)
  7.     - aKaiSa(s, n)

  8.     - ZhaLan(s, n)
  9.     - aZhaLan(s, n)

  10.     - ZhuanZhi(s, n)
  11.     - aZhuanZhi(s, n)

  12.     - split(s, f, n, *i)

  13.     - allin(s, n)
  14.     - aallin(s, n)

  15.     * 更多帮助参见其文档

  16. - 用以辅助模块制作的内容现可以被使用的 接口* 如下:
  17.     - mchr(n)
  18.     - get_list(lenth, seed = 5)

  19.     - class Square
  20.         - __init__(self, width, height, filler)

  21.     - test()

  22.     * 以上接口可能没有文档

  23. - 可以正常使用的接口已全部列举,使用未列举的接口可能导致模块不可用。


  24.                                         ——SYZ
  25. '''

  26. # 辅助函数
  27. def mchr(n):
  28.     if n >= 0x110000:
  29.         return chr(n - 0x110000)
  30.     elif n < 0:
  31.         return chr(n + 0x110000)
  32.     else:
  33.         return chr(n)
  34. def get_list(lenth, seed = 5):
  35.     r = []
  36.     import random as m
  37.     m.seed(seed)
  38.     l = tuple(range(lenth))
  39.     n = set()
  40.     for i in range(lenth):
  41.         while True:
  42.             t = m.choice(l)
  43.             if t in n:
  44.                 continue
  45.             break
  46.         r += [t]
  47.         n.add(t)
  48.     return r

  49. # 凯撒密码
  50. def KaiSa(s, n):
  51.     '''
  52.     - KaiSa(s, n)

  53.     - 使用凯撒密码加密字符串s,以字符串返回密文,整数n表示将通用编码增大的长。
  54.     - 使用模块内aKaiSa函数解密。
  55.     '''
  56.     r = ''
  57.     for each in s:
  58.         r += mchr(ord(each) + n)
  59.     return r
  60. def aKaiSa(s, n):
  61.     '''
  62.     - aKaiSa(s, n)

  63.     - 解密被模块内KaiSa函数加密的字符串s,以字符串返回明文,整数n是当初传给KaiSa函数的第二个参数。
  64.     '''
  65.     return KaiSa(s, -n)

  66. # 栅栏密码
  67. def ZhaLan(s, n):
  68.     '''
  69.     - ZhaLan(s, n)

  70.     - 使用栅栏密码加密字符串s,以字符串返回密文,整数n表示每组字符的个数。
  71.     - 使用模块内aZhaLan函数解密。
  72.     '''
  73.     r = ''
  74.     for i in range(n):
  75.         while True:
  76.             try:
  77.                 r += s[i]
  78.             except IndexError:
  79.                 break
  80.             i += n
  81.     return r
  82. class Square:
  83.     def __init__(self, width, height, filler):
  84.         self.width = width
  85.         self.height = height
  86.         self.dat = [[filler for i in range(width)] for i in range(height)]
  87.     def set_dat(self, pos, value):
  88.         self.dat[pos[1]][pos[0]] = value
  89.     def get_dat(self, x, y):
  90.         return self.dat[y][x]
  91.     def iter_x(self, x):
  92.         for y in range(self.height):
  93.             yield self.get_dat(x, y), (x, y)
  94.     def iter_y(self, y):
  95.         for x in range(self.width):
  96.             yield self.get_dat(x, y), (x, y)
  97.     def iter_by_right(self):
  98.         for y in range(self.height):
  99.             for x in range(self.width):
  100.                 yield self.get_dat(x, y), (x, y)
  101.     def iter_by_down(self):
  102.         for x in range(self.width):
  103.             for y in range(self.height):
  104.                 yield self.get_dat(x, y), (x, y)
  105. def aZhaLan(s, n):
  106.     '''
  107.     - aZhaLan(s, n)

  108.     - 解密被模块内ZhaLan函数加密的字符串s,以字符串返回明文,整数n是当初传给ZhaLan函数的第二个参数。
  109.     '''
  110.     if len(s) % n:
  111.         r = ''
  112.         t = Square(n, len(s) // n + 1, '')
  113.         p = 0
  114.         i = t.iter_by_down()
  115.         for each in i:
  116.             if each[1][1] == t.height - 1 and each[1][0] >= len(s) % n:
  117.                 continue
  118.             try:
  119.                 t.set_dat(each[1], s[p])
  120.             except IndexError:
  121.                 break
  122.             p += 1
  123.         i = t.iter_by_right()
  124.         for each in i:
  125.             r += each[0]
  126.         return r
  127.     else:
  128.         return ZhaLan(s, n)

  129. # 换字式密码

  130. # 转置式密码
  131. def ZhuanZhi(s, n):
  132.     '''
  133.     - ZhuanZhi(s, n)

  134.     - 使用转置式密码加密字符串s,以字符串返回密文,整数n表示随机的种子。
  135.     - 使用模块内aZhuanZhi函数解密。
  136.     '''
  137.     r = ''
  138.     l = get_list(len(s), n)
  139.     for i in l:
  140.         r += s[i]
  141.     return r
  142. def aZhuanZhi(s, n):
  143.     '''
  144.     - aZhuanZhi(s, n)

  145.     - 解密被模块内ZhuanZhi函数加密的字符串s,以字符串返回明文,整数n是当初传给ZhuanZhi函数的第二个参数。
  146.     '''
  147.     r = ''
  148.     d = {}
  149.     l = get_list(len(s), n)
  150.     for i in range(len(s)):
  151.         d[l[i]] = i
  152.     for i in range(len(s)):
  153.         r += s[(d[i])]
  154.     return r

  155. # 分割分别编译
  156. def split(s, f, n, *i):
  157.     '''
  158.     - split(s, f, n, *i)

  159.     - 循环以收集参数i为步长分割字符串s,分别以分割后的各部分为第一个参数、整数n为第二个参数传给 函数f* 处理,返回各次处理所得字符串按顺序拼接的字符串。
  160.     * 应为模块内可用加解密函数,不保证非模块内可用加解密函数的运行结果
  161.     '''
  162.     while sum(i) < len(s):
  163.         i *= 2
  164.     while sum(i) > len(s):
  165.         i = i[0:len(i) - 1]
  166.     if sum(i) != len(s):
  167.         i += (len(s) - sum(i),)
  168.     r = ''
  169.     p = 0
  170.     for each in i:
  171.         r += f(s[p:p + each], n)
  172.         p += each
  173.     return r

  174. # 复合可用密码
  175. def allin(s, n):
  176.     '''
  177.     - allin(s, n)

  178.     - 复合模块内全部可用加密函数* 加密字符串s,以字符串返回密文,整数n表示将传给各个子函数的第二个参数。
  179.     - 使用模块内aallin函数解密。
  180.     * 先后复合函数KaiSa、ZhaLan、ZhuanZhi
  181.     '''
  182.     return split(split(split(s, KaiSa, n, 5, 6, 7, 8, 9), \
  183.                        ZhaLan, n, 5, 6, 7, 8, 9), \
  184.                  ZhuanZhi, n, 5, 6, 7, 8, 9)
  185. def aallin(s, n):
  186.     '''
  187.     - aallin(s, n)

  188.     - 解密被模块内allin函数加密的字符串s,以字符串返回明文,整数n是当初传给allin函数的第二个参数。
  189.     '''
  190.     return split(split(split(s, aZhuanZhi, n, 5, 6, 7, 8, 9), \
  191.                        aZhaLan, n, 5, 6, 7, 8, 9), \
  192.                  aKaiSa, n, 5, 6, 7, 8, 9)

  193. # 模块测试
  194. def test():
  195.     s = '中文字符 EnglishLetters 0123456789 ~!@#$%^&*()_+\n'
  196.     if s == aallin(allin(s, 5), 5):
  197.         return True
  198.     return False
  199. if __name__ == '__main__':
  200.     if test():
  201.         print('Usual')
  202.     else:
  203.         print('Unusual')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-27 06:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表