Rot18,加密和解密(python,Sublime Text)



我正在寻找一个插件,可以在Sublime text v3.2.2中使用rot18加密/解密文本。

我试过这个教程(只有rot13(,但它对我不起作用:https://www.sublimetext.com/docs/plugin-examples

我尝试了很多插件,唯一一个运行良好的插件是:(不幸的是它是rot47(

import sublime
import sublime_plugin
class Rot47Command(sublime_plugin.TextCommand):
def run(self, edit):
for region in self.view.sel():
if not region.empty():
s = self.view.substr(region)
s = ''.join(chr(33 + ((ord(ch) + 14) % 94)) for ch in s)
self.view.replace(edit, region, s)

有人在rot18上有任何功能插件吗?

您可以调整您的代码。以下是rot_N的工作原理:

这是高达127:的ASCII范围

a = 32  
for k in range(0,16):
print(a+k, chr(a+k), "    ", a+16+k, chr(a+16+k), "    ", a+32+k, chr(a+32+k), "    ", 
a+48+k, chr(a+48+k), "    ", a+64+k, chr(a+64+k), "    ", a+80+k, chr(a+80+k))
#    32        48 0      64 @      80 P       96 `      112 p
#    33 !      49 1      65 A      81 Q       97 a      113 q
#    34 "      50 2      66 B      82 R       98 b      114 r
#    35 #      51 3      67 C      83 S       99 c      115 s
#    36 $      52 4      68 D      84 T      100 d      116 t
#    37 %      53 5      69 E      85 U      101 e      117 u
#    38 &      54 6      70 F      86 V      102 f      118 v
#    39 '      55 7      71 G      87 W      103 g      119 w
#    40 (      56 8      72 H      88 X      104 h      120 x
#    41 )      57 9      73 I      89 Y      105 i      121 y
#    42 *      58 :      74 J      90 Z      106 j      122 z
#    43 +      59 ;      75 K      91 [      107 k      123 {
#    44 ,      60 <      76 L      92       108 l      124 |
#    45 -      61 =      77 M      93 ]      109 m      125 }
#    46 .      62 >      78 N      94 ^      110 n      126 ~
#    47 /      63 ?      79 O      95 _      111 o      127 

ROT n意味着你取chr(ord(l)+n)的字母。包裹时要小心。

对于rot_N的计算,基本公式为:

def rot_N(n,letter):
return chr( (ord(letter)-32+n) % (128-32) + 32)    # 128-32 = 96

您可以使用进行测试

k="Hello Zzzzz"
print( ''.join(rot_N(18, l) for l in k))   # schould give you a tranlation
print( ''.join(rot_N(0, l) for l in k))    # should give the exact text

并使用测试反向

k_inverse ="Zw~~!2l,,,,"
print( ''.join(rot_N(-18, l) for l in k_inverse))   # use -18 here
print( ''.join(rot_N(0, l) for l in k_inverse)) 

如果更换

s = ''.join(chr(33 + ((ord(ch) + 14) % 94)) for ch in s)

s = ''.join(rot_N(18, ch) for ch in s)) 

你应该没事的。

您没有指定,但我假设您在36个字符的字符集0..9,A..Z上使用ROT-18。36/2=18,因此ROT-18。

ROT-13适用于26个字母字符:26/2=13。你想让它适应ROT-18。

主要的区别在于,ASCII字符集中的字母字符是连续的,并且这种假设内置于要复制的代码中。ROT-47也是如此;所使用的ASCII字符是连续的。对于ROT-18,数字0..9和字母字符A..Z在ASCII中不是连续的。从:(#58(到@(#64(,它们之间存在间隙。该区域中的ASCII代码既不是数字也不是字母。

一种解决方案是设置自己的数组,而不是按照ASCII顺序,其中两者是连续的:[0, 1, ... 9, A, B, ... Z]。编写程序来处理该数组。

或者,您可以使用ASCII代码,专门处理从#58到#64的代码,以使转换正确。

第一个选项可能更容易,代码将更类似于ROT-13示例。主要的区别是将返回ASCII代码的ord()函数替换为给出数组中位置的等效函数。

最新更新