• lua rc4算法实现


      由于项目需要,用python django写restful接口遇到瓶颈,python django+uwsgi处理请求是会阻塞的,

    如果阻塞请求不及时处理,会卡住越来越多的其它的请求,导致越来越多的502。所以将请求处理频繁的,会阻

    塞长时间的接口用lua实现,lua放在nginx里跑,还是很快的。

      呵呵,费话少说了!

      项目因用 到rc4加密算法,但网上实现lua rc4算法的很少,有的要依赖lua第三方库,很不方便。根据wiki

    现自己的算法:

      

    -- RC4
    -- http://en.wikipedia.org/wiki/RC4
    
    function KSA(key)
        local key_len = string.len(key)
        local S = {}
        local key_byte = {}
    
        for i = 0, 255 do
            S[i] = i
        end
    
        for i = 1, key_len do
            key_byte[i-1] = string.byte(key, i, i)
        end
    
        local j = 0
        for i = 0, 255 do
            j = (j + S[i] + key_byte[i % key_len]) % 256
            S[i], S[j] = S[j], S[i]
        end
        return S
    end
    
    function PRGA(S, text_len)
        local i = 0
        local j = 0
        local K = {}
    
        for n = 1, text_len do
    
            i = (i + 1) % 256
            j = (j + S[i]) % 256
    
            S[i], S[j] = S[j], S[i]
            K[n] = S[(S[i] + S[j]) % 256]
        end
        return K
    end
    
    function RC4(key, text)
        local text_len = string.len(text)
    
        local S = KSA(key)        
        local K = PRGA(S, text_len) 
        return output(K, text)
    end
    
    function output(S, text)
        local len = string.len(text)
        local c = nil
        local res = {}
        for i = 1, len do
            c = string.byte(text, i, i)
            res[i] = string.char(bxor(S[i], c))
        end
        return table.concat(res)
    end
    
    
    -------------------------------
    -------------bit wise-----------
    -------------------------------
    
    local bit_op = {}
    function bit_op.cond_and(r_a, r_b)
        return (r_a + r_b == 2) and 1 or 0
    end
    
    function bit_op.cond_xor(r_a, r_b)
        return (r_a + r_b == 1) and 1 or 0
    end
    
    function bit_op.cond_or(r_a, r_b)
        return (r_a + r_b > 0) and 1 or 0
    end
    
    function bit_op.base(op_cond, a, b)
        -- bit operation
        if a < b then
            a, b = b, a
        end
        local res = 0
        local shift = 1
        while a ~= 0 do
            r_a = a % 2
            r_b = b % 2
       
            res = shift * bit_op[op_cond](r_a, r_b) + res 
            shift = shift * 2
    
            a = math.modf(a / 2)
            b = math.modf(b / 2)
        end
        return res
    end
    
    function bxor(a, b)
        return bit_op.base('cond_xor', a, b)
    end
    
    function band(a, b)
        return bit_op.base('cond_and', a, b)
    end
    
    function bor(a, b)
        return bit_op.base('cond_or', a, b)
    end
    
    --key = "Key"
    --text = "Plaintext"
    --K = RC4(key, text)
    --print (K)
    --text = RC4(key, K)
    --print (text)
    --
    --key = "Wiki"
    --text = "pedia"
    --K = RC4(key, text)
    --print (K)
    --
    --key = "Secret"
    --text = "Attack at dawn"
    --K = RC4(key, text)
    --print (K)

      可以根据python的Crypto.Cipher库中ARC4算法比较,相关代码在github

  • 相关阅读:
    网络流24题 餐巾计划(DCOJ8008)
    网络流24题 负载平衡(DCOJ8013)
    tyvj1982 武器分配
    bzoj1877 晨跑
    bzoj1834 网络扩容
    草地排水 改了又改(DCOJ6013)
    codevs1033 蚯蚓的游戏问题
    codevs1227 方格取数2
    bzoj1412 狼和羊的故事
    codevs1839 洞穴勘测
  • 原文地址:https://www.cnblogs.com/zhuangzebo/p/3864421.html
Copyright © 2020-2023  润新知