Python中的RC4加密

时间:2016-04-25 07:07:34

标签: python encryption cryptography

我已经浏览了几个使用RC4分组密码的python脚本...我在完成程序时遇到问题,以便正确输出......

程序当前要求输入“密钥”和“明文”(用密钥加密的文本)。 并输出一个编码的字符串......我想。所以如果我输入单词“Plaintext”加密我得到以下内容。但我认为这是不完整的......

[187, 243, 22, 232, 217, 64, 175, 10, 211]

我希望我的加密输出为十六进制

BB F3 16 E8 D9 40 AF 0A D3

我的节目目前还不完整,但只是想了解如何

  1. 完成加密部分,使其输出为十六进制(我想我必须将字节转换为十六进制?)
  2. 编辑:以上内容已由Ebrahim解决。只需要解密帮助

    1. 我迷失在哪里开始解密...我希望能够输入一个密钥和一个十六进制的密文;并将密文解密为明文。
    2. 我理解加密过程中的逻辑,但是我很难掌握解密过程,即使它非常相似。

      # 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.
      

2 个答案:

答案 0 :(得分:1)

要将十进制输出转换为十六进制输出:

>>> 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 :(得分:0)

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

  • 第一个 RC4 不是分组密码,而是流密码
  • 其次,解密与加密完全相同,因为该算法通过将明文与使用密钥获得的某些流进行异或来生成密文,并且异或是可逆的,这意味着:解密只需将密文与相同的生成流。