首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的RC4加密

Python中的RC4加密
EN

Stack Overflow用户
提问于 2016-04-25 07:07:33
回答 2查看 11.5K关注 0票数 1

我看过几个使用RC4块密码的python脚本.我在完成程序时遇到了问题,这样它才能正常输出.

程序目前要求一个“密钥”和“明文”(使用密钥加密的文本)。输出一个编码的字符串..。我认为。因此,如果我输入单词“明文”来加密,我会得到以下信息。但我认为这是不完整的..。

代码语言:javascript
复制
[187, 243, 22, 232, 217, 64, 175, 10, 211]

我想用十六进制加密输出

代码语言:javascript
复制
BB F3 16 E8 D9 40 AF 0A D3

我的程序目前还不完整,只是想了解一下如何

  1. 完成加密部分,使其输出为十六进制(我认为我必须将字节转换为十六进制?)

编辑:上述问题已由易卜拉欣解决。只是在解密方面需要帮助

  1. 我不知道从哪里开始解密..。我希望能够有一个输入,它将以十六进制的形式接收密钥和密文;并将密文解密为明文。

我理解加密过程中的逻辑,但我很难理解解密过程,尽管它非常相似。

代码语言:javascript
复制
# Global variables
state = [None] * 256
p = q = None

def setKey(key):
    ##RC4 Key Scheduling Algorithm
    global p, q, state
    state = [n for n in range(256)]
    p = q = j = 0
    for i in range(256):
        if len(key) > 0:
            j = (j + state[i] + key[i % len(key)]) % 256
        else:
        j = (j + state[i]) % 256
    state[i], state[j] = state[j], state[i]

def byteGenerator():
    ##RC4 Pseudo-Random Generation Algorithm
    global p, q, state
    p = (p + 1) % 256
    q = (q + state[p]) % 256
    state[p], state[q] = state[q], state[p]
    return state[(state[p] + state[q]) % 256]

def encrypt(key,inputString):
    ##Encrypt input string returning a byte list
    setKey(string_to_list(key))
    return [ord(p) ^ byteGenerator() for p in inputString]

def decrypt(inputByteList):
    ##Decrypt input byte list returning a string
    return "".join([chr(c ^ byteGenerator()) for c in inputByteList])



def intToList(inputNumber):
    ##Convert a number into a byte list
    inputString = "{:02x}".format(inputNumber)
    return [int(inputString[i:i + 2], 16) for i in range(0,    len(inputString), 2)]

def string_to_list(inputString):
    ##Convert a string into a byte list
    return [ord(c) for c in inputString]




loop = 1
while loop == 1: #simple loop to always bring the user back to the menu

    print("RC4 Encryptor/Decryptor")
    print
    print("Please choose an option from the below menu")
    print
    print("1) Encrypt")
    print("2) Decrypt")
    print

    choice = input("Choose your option: ")
    choice = int(choice)

    if choice == 1:
        key = raw_input("Enter Key: ")
        inputstring = raw_input("enter plaintext: ")
        encrypt(key, inputstring)


    elif choice == 2:   
        key = raw_input("Enter Key: ")
        ciphertext = raw_input("enter plaintext: ")
        print decrypt(intToList(ciphertext))

    elif choice == 3: 
    #returns the user to the previous menu by ending the loop and clearing the screen.
        loop = 0

    else:   
        print ("please enter a valid option") #if any NUMBER other than 1, 2 or 3 is entered.
EN

回答 2

Stack Overflow用户

发布于 2016-04-25 07:18:35

若要将十进制输出转换为十六进制输出,请执行以下操作:

代码语言:javascript
复制
>>> arr = [187, 243, 22, 232, 217, 64, 175, 10, 211]
>>> ' '.join('%02x'%i for i in arr)
'bb f3 16 e8 d9 40 af 0a d3'
>>> 
票数 1
EN

Stack Overflow用户

发布于 2021-07-15 16:17:52

我知道这是个很老的问题,但这里有一些内情,以防万一:

  • 首先,RC4不是分组密码,而是流密码。
  • 第二,解密和加密完全相同,因为算法通过XORing生成明文,其中明文是用密钥获得的流,异或是可逆的,意思是:去密码只需要对同一生成流的密文进行异或。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36834013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档