zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    mysql5.7-Group Replication
    yum安装mariadb-galera同步
    开启tomcat的apr模式,并利用redis做tomcat7的session的共享。
    利用Xtrabackup在不停机的情况下备用数据库迁移
    open-falcon(v0.2)安装grafana部署
    open-falcon(v0.2)部署手册(源码编译)
    阿里云ECS主机自定义进程监控
    Open-Falcon第七步安装报警模块(小米开源互联网企业级监控系统)
    Open-Falcon第六步安装Dashboard(小米开源互联网企业级监控系统)
    Open-Falcon第五步安装Query(小米开源互联网企业级监控系统)
  • 原文地址:https://www.cnblogs.com/zhuangzebo/p/3864421.html
Copyright © 2011-2022 走看看