请选择 进入手机版 | 继续访问电脑版

登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 266|回复: 0

[lua教程] 【lua教程】RC4加解密实现代码

[复制链接]

441

主题

506

帖子

1944

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1944

荣誉管理论坛元老

发表于 2021-6-30 23:16:48 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. require "import"
    5 U- j6 g$ }# p  [8 u: i
  2. import "android.app.*": [4 t/ z" ]! w7 t9 t( L( U
  3. import "android.os.*", K! S6 b- j. V% P6 j0 z
  4. import "android.widget.*"
    . I" V8 ~7 a5 ?) k1 e$ x# {
  5. import "android.view.*"
    * c& d) k; ^: H& z! g4 h
  6. " F7 B0 Q( K+ E2 z
  7. activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题4 K( ]+ k8 h8 a  _5 N
  8. activity.setTitle("RC4加解蜜")) m& G$ `! ^9 W' m6 V4 x* n$ v

  9. 8 H& v/ U' e5 o6 P3 J
  10. --Copyright© Ayaka_Ago. All Rights Reserved.
    : e* m4 a+ I" W
  11. --加解密函数由 凌云(3116817790) 开源
    9 P  g$ [. i; _" X1 d) a( T
  12. 6 O& j  J- F+ S  [
  13. local minicrypto = {}--RC4加解密算法(lua实现)
    / f" B: P# W3 a  r9 p( \* z0 Q
  14. local insert, concat, modf, tostring,char = table.insert, table.concat, math.modf,tostring, string.char- a( F6 V5 t% c
  15. local function numberToBinStr(x)& S6 r+ O+ P% `
  16.   local ret = {}
    . n- B, n5 [+ m$ q. [4 ?) C
  17.   while x~=1 and x~=0 do% b, p3 ~8 N! e
  18.     insert(ret, 1, x%2)
    $ ?  l* u$ B( X' w
  19.     x=modf(x/2)5 [+ C" C; q) Y0 O/ ?6 }5 P
  20.   end% T8 d' U4 l. m1 s9 Y" @
  21.   insert(ret, 1, x)
    3 B0 m$ y% W/ P' u4 h4 j
  22.   for i = 1, 8 - #ret do
    0 j0 E* _3 g7 _. g2 P
  23.     insert(ret, 1, 0)4 v7 E5 i1 A: I
  24.   end, L! K( f" P) ]! d* L
  25.   return concat(ret)
    . ^$ V7 @& i( w! i
  26. end  S$ }2 C( Y: \& M# D
  27. local function computeBinaryKey(str)
    % g% V8 S, ^6 O  D0 x8 L
  28.   local t = {}1 ]4 Y$ V5 M6 S( }
  29.   for i = #str, 1, -1 do
    8 z: Q5 q5 a) N3 Y( _5 r; n" o
  30.     insert(t, numberToBinStr(str:byte(i,i)))" M  l, {' I$ X, L  p  _1 y
  31.   end' w+ H5 c9 T6 e' {8 \& @
  32.   return concat(t)
    4 |7 k6 n. ^. ?, k$ [
  33. end
    & f" L0 }. y+ ~
  34. local binaryKeys = setmetatable({}, {__mode = "k"})! p+ z) W4 v7 Q
  35. local function binaryKey(key)
    + a6 U  c* ]; [4 R
  36.   local v = binaryKeys[key]  j5 M( T2 C: _( D/ L6 x5 K
  37.   if v == nil then7 f- f6 @# O' ?  p: d- \! Y
  38.     v = computeBinaryKey(key)
    $ I/ x, O, k- t# Q
  39.     binaryKeys[key] = v5 P% x. k/ d6 J& k; {
  40.   end
    9 g: g% x3 s- p  L
  41.   return v
    4 z; |# w, G3 o- f
  42. end
    # R9 H- b/ m+ H" T" _4 l
  43. local function initialize_state(key)
    ; F- X3 T5 b# P1 f5 S  l( A
  44.   local S = {}; for i = 0, 255 do S[i] = i end+ o4 Y/ D% s+ T2 n6 |
  45.   key = binaryKey(key)6 ]8 w3 _% q. X7 l8 }3 N
  46.   local j = 0
    6 B# s8 V- d& k, v
  47.   for i = 0, 255 do9 e  b8 E* t0 O7 W6 V. M# G! H
  48.     local idx = (i % #key) +1
    / R# i5 P  m0 C3 ]5 V, R. d
  49.     j = (j + S[i] + tonumber(key:sub(idx, idx))) % 256
    + M# v( u) y. e9 s# N) A3 n
  50.     S[i], S[j] = S[j], S[i]
    5 S3 ^: g( L+ Y8 E" R
  51.   end! f! V: C& V# d- r
  52.   S.i = 0" b* s& j( Q$ m0 b* ?/ f
  53.   S.j = 0
    : \) U! y! O% @4 r6 s5 l4 l
  54.   return S
    7 l6 [9 l9 w" W6 S* \
  55. end5 F5 @# `; i. m% ^( w2 ^
  56. local function encrypt_one(state, byt)- ?3 U% Z! Y" I. V% k9 ]2 J
  57.   state.i = (state.i+1) % 256
    ! c9 h9 @0 N, D! z# E
  58.   state.j = (state.j + state[state.i]) % 256& C' G  X; ?" p! K
  59.   state[state.i], state[state.j] = state[state.j], state[state.i]
      Q' t7 T- D6 u1 [( l& q& x9 M( p
  60.   local K = state[(state[state.i] + state[state.j]) % 256]+ y5 X1 s# L& t# l+ i. s& x# i) n
  61.   return K ~ byt8 e7 b0 n  ?, ~) `/ J# }) D
  62. end
    : L7 u  P0 O# T' }
  63. function minicrypto.encrypt(text, key)/ Z$ m3 _5 U! y6 Y1 k
  64.   local state = initialize_state(key)/ H% I; |- w% b8 A
  65.   local encrypted = {}4 ]1 S+ I8 }% i  G
  66.   for i = 1, #text do: Q4 o* u+ h4 O1 F4 n' L- Z( h
  67.     encrypted[i] = ("%02X"):format(encrypt_one(state, text:byte(i,i)))0 {5 m7 {3 F' x' Y
  68.   end! r/ ^0 d' G( K) S# A
  69.   return concat(encrypted). l9 W" p6 p7 X- K' P
  70. end
    2 j" p7 T# B1 j8 y4 N4 E
  71. function minicrypto.decrypt(text, key)+ u2 \$ |2 `2 Y" u2 S: C: k" U
  72.   local state = initialize_state(key); G) L6 K; U; L; l% y
  73.   local decrypted = {}
    / n% A* }: s: I7 j  i- F
  74.   for i = 1, #text, 2 do8 Y/ S3 T3 e6 T- ?3 V( t
  75.     insert(decrypted, char(encrypt_one(state, tonumber(text:sub(i, i+1), 16))))
    ; C5 t5 [: b' }+ [6 H9 ?6 E0 L0 I
  76.   end
    9 D+ m* p  N1 A) [! e3 W9 w& D* F
  77.   return concat(decrypted). D0 w8 y9 m& P
  78. end9 H) z" ^0 @% w& |# o& Z- b
  79. ; I5 q% O8 `& o' w8 C- Z+ C
  80. this.setContentView(loadlayout({  f+ S, N0 w- r9 N
  81.   LinearLayout,
    5 `$ G( G: b1 R$ R
  82.   orientation="vertical",
    : x9 r* T* m+ ]3 z$ X: j
  83.   {
    - O  \/ d- D/ S% y7 J/ w1 I4 J
  84.     TextView,6 T* _: V  r& p, C6 v* @. s( \
  85.     text="RC4加解密",
    8 S& }' j0 [# e, j6 L
  86.     layout_height="52dp",
    * q: |, w$ {$ M( s/ K) ?5 `& |6 v
  87.     paddingLeft="18dp",# {8 {+ \$ _0 k* J4 W$ m3 ]! I
  88.     textSize="18dp",  x: O6 e: B  ]
  89.     gravity="center",
    % a. g- a* C/ a
  90.     textColor=图标色,
    & J  |9 z1 `7 b$ q, e* Z
  91.   },! x' C3 D& l. n$ v) Y7 ]6 m; W% D  S
  92.   {+ A! T. r$ f# G$ A
  93.     ScrollView,6 J4 ]3 \0 K9 z9 J. u! l6 |/ p: A" S
  94.     layout_width="fill",
    ' w6 O$ d! P2 o# n1 A! U9 @
  95.     {+ e- x  p1 p" o. H9 E
  96.       LinearLayout,9 }) p4 E: s0 Q7 m7 t0 U6 [; r# C
  97.       orientation="vertical",- u: m. w9 j) w7 R1 L
  98.       padding="18dp",' ?+ X$ ]; M) B# E
  99.       layout_width="fill",
    * }2 F' L7 Z: ?
  100.       {
    - [% a! _! v* u1 Q5 P7 R9 Q
  101.         EditText,) m2 f, S8 O6 u/ T
  102.         layout_marginBottom="18dp",
    9 t' H# K! t- X) @5 c( M7 O
  103.         layout_width="fill",
    / N' I/ W; q7 K4 ?: o( l
  104.         backgroundColor=0,2 ~: V1 n' d* I2 o6 G
  105.         textSize="16dp",
    8 |( p* G' o6 M3 T
  106.         textColor=文字色,1 Y6 z6 O( U% h* k% S1 R7 B, w
  107.         id="from"," N: D0 X( q# ^- t2 i
  108.         gravity="top",
    4 i8 {  c' \& ]( A6 T* W) j" l
  109.         minLines=6,
    : I" a/ q. h+ ~$ e2 O
  110.         hint="输入要加密/解密的内容",
    % |/ L+ Y  o. d4 E2 N
  111.         hintTextColor=次要文字色,- a' I1 a9 ^; Z8 T5 l5 O' ?8 K
  112.       },
    9 |  f* W  C9 \9 d0 V% v' Z
  113.       {6 A6 P. t/ r, V2 {3 x4 e
  114.         CardView,( E. D9 i. I7 m3 u2 L3 W% y
  115.         radius="20dp",
    9 y0 P! s7 P0 }" I1 W) k+ K' z
  116.         layout_width="fill",
    " e' v( w! H# d* [- C! v% M
  117.         backgroundColor=强调色,
    9 x4 Q" l  a. N" D0 R; ~
  118.         layout_marginBottom="18dp",
    2 ~7 o$ J" K5 Z# T' q
  119.         {1 P3 C" w9 s& z. ~% i8 Z1 v  ~
  120.           LinearLayout,: R. P, q& t" Q0 G9 `, e6 y
  121.           layout_width="fill",
    & P* b9 P& w# P6 \, g2 ~9 M
  122.           {
    , Q2 d1 I0 ~; J& |1 c. U- ^
  123.             TextView,
    0 l5 M8 R5 e* `$ P  j0 `. y2 H
  124.             textColor="#009688",
    2 x9 r8 \) B5 H6 U6 e# O: z
  125.             text="解密",
    2 j# W! Z% G" R- _
  126.             gravity="center",& d; L2 ^" W; }6 I# f, g
  127.             layout_marginLeft="12dp",4 i- L# E+ T. `0 ]
  128.             layout_marginRight="12dp",
    3 K0 @- \1 `8 V* {. L0 d8 d% i
  129.             textSize="16dp",8 G* v; y7 O( \0 H- V7 k
  130.             layout_weight=1,/ l1 K' o5 N6 }1 \! T
  131.             onClick=function()) X" j: F: @  c1 L
  132.               if pcall(function() resul.text=minicrypto.decrypt(from.text,pass.text) end) then else
    ) H& M+ `, T) R; |3 N1 Y. o
  133.                 print("请输入密钥") end
    6 ?$ V3 z; o$ z1 Y2 F2 i
  134.             end,2 G9 ~8 G% D! E  m2 u1 e: y( q% n
  135.             --backgroundDrawable=波纹(0x40000000),/ x$ d: @1 f2 _( C8 l; R
  136.           },
    . ~! w! w& B( G' V9 v, d
  137.           {$ e* J& c( c- F9 D, @* g
  138.             EditText,
    * t& M8 G4 p$ @( [. a
  139.             layout_weight=1,2 I# ?( ?" ^! y5 Q
  140.             backgroundColor=0,' j7 Q! Q% L0 q  _( {! }6 E
  141.             textSize="16dp",
      |+ L5 S' ~: b7 u, ^
  142.             gravity="center",& Z( h0 g" N4 h5 E& `! T; O
  143.             textColor="#66ccff",/ e6 h* U% t$ d1 m3 I
  144.             singleLine=true,! D9 {) i( o$ D4 f6 y
  145.             id="pass",2 O0 w/ p' s# w3 i$ k& @

  146. / R; K5 U* G" i5 N6 Q" h. I7 z/ t0 W
  147.             hint="输入密钥",
    / r; j$ R2 K, q1 o' H( M; l
  148.             hintTextColor="#009688"
    7 I) s7 W  w5 |- G  i
  149.             --hintTextColor=Color.LTGRAY,
    ' z/ ~7 @2 c; |4 I3 s/ N4 \
  150.           },
    , t& k$ @) k1 H, @. D0 s; }, H
  151.           {
    6 @/ ~1 l. p. Z' b, L/ C) m
  152.             TextView,& v+ W# S# k( k& x% Y; |
  153.             textColor="#009688",
    % Q% a5 b3 H! e/ C# `6 ^
  154.             layout_marginLeft="12dp",
    * s% V$ U+ H  ]+ e" U$ F8 g* s6 O" K" x
  155.             layout_marginRight="12dp",
    ' J9 q1 s' F; U
  156.             gravity="center",- q1 I) T& ?3 R; O% ?
  157.             text="加密",
    + G2 D" Q: Q' M$ ~/ h9 q, k" ]( x
  158.             textSize="16dp",
      N8 m6 L, x/ u) O
  159.             onClick=function()4 b1 r8 T* c' i. u' ^4 S$ a
  160.               if pcall(function() resul.text=minicrypto.encrypt(from.text,pass.text) end) then else
    & Y3 [( s, Q5 U& S  y9 c) k
  161.                 toast("请输入密钥") end
    ! v# b( E$ S2 o$ u* W
  162.             end,
    & Y5 x1 |9 V, n, m
  163.             --backgroundDrawable=波纹(0x40000000),& R9 [0 Y' G1 {' L+ l% h* |; s
  164.             layout_weight=1,) d6 K9 ~1 i7 e
  165.           },
    ; o5 k5 K/ m+ U: z& K; U' J1 B
  166.         },; D! k6 I6 i8 t, H9 B; g( V1 y: ?
  167.       },
    7 S6 U) _% e: v( {
  168.       {# O% n/ M# f% `7 ^
  169.         TextView,
    2 I) d3 L4 N+ [- K- b
  170.         layout_width="fill",
    5 w9 o4 H. S, n: X
  171.         textColor=文字色,( t3 j: V$ F* t0 Z/ u' b
  172.         text="加密/解密后的文本显示在此处",$ [2 t# e9 P# l4 k3 e4 Z- ]
  173.         textSize="16dp",
    ) T. I4 N' D- c# z" |& v7 N
  174.         padding="6dp",
    ' `' g% N- r. x+ h0 L/ K! ~
  175.         id="resul",1 D! e4 \; F! ~6 `8 x& y
  176.         textIsSelectable=true,
    , m7 |( e( _8 I% P
  177.       },2 j/ k. r. u/ u8 k! [, _6 L2 l3 R
  178.     },
    , F- G9 O9 m. N7 i
  179.   },- ^+ Q) y0 U0 Q- _5 c( Z6 a! q
  180. }))4 L7 u( l  U; `
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|星空社区

GMT+8, 2022-8-11 22:59 , Processed in 0.060697 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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