密码学 - 异或加密



异或函数广泛应用于密码学、数字逻辑电路、网络保护以及 Python、Java 和 C++ 等编程语言。异或运算也称为“互斥或”。

逻辑函数异或(互斥或)比较两个二进制数字,如果它们不同则返回 1。如果两个位完全相等,则异或函数返回 0。换句话说,如果其中一个二进制数字为 1 但不是两个都为 1,则异或给出 1。

正如我们上面讨论的,异或可以用于密码学中的加密。因此,借助异或加密,我们可以加密难以使用蛮力破解的数据。例如,创建与正确密钥匹配的随机加密密钥。

使用 Python 实现

我们可以使用以下 Python 方法实现异或加密:

  • 使用 For 循环和固定密钥

  • 使用随机密钥生成

  • 使用 base64 模块

在接下来的部分中,我们将尝试简要解释这些方法中的每一种,以便您能够更好地理解使用 Python 的异或加密。

方法 1:使用 for 循环和固定密钥

异或加密是一种简单的对称加密算法,其中输入消息中的每个单独字符都使用异或运算与密钥组合。因此,我们可以使用异或运算逐个字符地加密我们的输入消息,并且在这里我们可以为每个字符使用一个固定密钥。在我们的例子中,密钥是“T”。然后将异或运算的结果转换回字符。

使用密钥对每个字符进行异或运算的过程隐藏了原始消息,使其在没有加密密钥的情况下难以阅读。

以下是在明文中执行异或加密的示例:

示例

#Our XOR encryption function
def xorEncrypt(inpString): 
   my_xor_key = 'T'
   length = len(inpString)
   encrypted_msg = ""
   for i in range(length): 
      encrypted_msg += chr(ord(inpString[i]) ^ ord(my_xor_key))

   return encrypted_msg

demoMsg = "This is Tutorialspoint"

# Encrypt the string 
print("Original Message: ", demoMsg)
encrypted_message = xorEncrypt(demoMsg)
print("Our Encrypted Message: ", encrypted_message) 

以下是上述示例的输出:

输入/输出
Original Message:  This is Tutorialspoint
Our Encrypted Message:  <='t='t! ;&=58'$;=: 

方法 2:使用随机密钥生成

在这种方法中,我们将使用 Python 的 random 模块生成随机密钥,以创建与消息长度相同的密钥用于异或加密。它使用 random.choice() 方法从 string 模块中随机选择 ASCII 字符。

在 xorEncrypt 函数中,生成的密钥和消息作为参数传递。zip 函数用于同时迭代消息和密钥的对应字符。

此过程为加密过程增加了随机性和安全性。

以下是使用随机密钥生成进行异或加密的 Python 实现:

示例

import random
import string

#Generate random key
def generate_key(length):
   return ''.join(random.choice(string.printable) for _ in range(length))

# XOR Encryption function
def xorEncrypt(message, key):
   encrypted = ''.join(chr(ord(char) ^ ord(key_char)) for char, key_char in zip(message, key))
   return encrypted

#Function execution and input message
message = "Hello, Everyone!"
key = generate_key(len(message))
encrypted_msg = xorEncrypt(message, key)
print("Encrypted Message:", encrypted_msg)
decrypted_msg = xorEncrypt(encrypted_msg, key)
print("Decrypted Message:", decrypted_msg)

以下是上述示例的输出:

输入/输出
Encrypted Message: e-2( vH#R\29 
Decrypted Message: Hello, Everyone!

方法 3:使用 base64 模块

Python 中的 base64 模块提供使用 Base64 编码对信息进行编码和解码的功能。因此,我们将使用用户定义的密钥对输入消息执行异或加密。加密消息后,我们将使用 base64 对其进行编码以创建加密消息。

这是一个实现,它显示了使用用户定义的密钥进行异或加密,然后使用 base64 对加密的消息进行编码:

示例

import base64

def xorEncrypt(message, key):
   encrypted = ''.join(chr(ord(char) ^ ord(key[i % len(key)])) for i, char in enumerate(message))
   return encrypted

def main():
   try:
      message = "Hello my name is Azaad"
      key = "T"
      print("Our Original Message is:", message)
      # Encrypt the message using XOR encryption
      encrypted_message = xorEncrypt(message, key)

      # Encode the encrypted message using base64
      encoded_message = base64.b64encode(encrypted_message.encode()).decode()

      print("Encrypted and encoded message:", encoded_message)

   except Exception as e:
      print("An error occurred:", str(e))

if __name__ == "__main__":
   main()

以下是上述示例的输出:

输入/输出
Our Original Message is: Hello my name is Azaad
Encrypted and encoded message: HDE4ODt0OS10OjU5MXQ9J3QVLjU1MA==

使用 Java 实现

在此实现中,我们将使用 Java 的 Base64 类来实现 Base64 编码和解码功能。此类仅包含用于获取 Base64 编码方法的编码器和解码器的静态方法。此类的实现支持 RFC 4648 和 RFC 2045 中指定的 Base64 类型。

示例

因此,以下是使用 Java 的 Base64 类实现 Base64 编码和解码的方法

import java.util.Base64;

public class Base64Class {
   public static void main(String[] args) {
      // Encoding process
      String plaintext = "Hello, Tutorialspoint!";
      String encoded_message = Base64.getEncoder().encodeToString(plaintext.getBytes());
      System.out.println("The Encoded string: " + encoded_message);

      // Decoding process
      byte[] decodedBytes = Base64.getDecoder().decode(encoded_message);
      String decodedString = new String(decodedBytes);
      System.out.println("The Decoded string: " + decodedString);
   }
}

以下是上述示例的输出:

输入/输出

The Encoded string: SGVsbG8sIFR1dG9yaWFsc3BvaW50IQ==
The Decoded string: Hello, Tutorialspoint!

使用 C++ 实现

C++ 代码实现了一个将字符串编码为 Base64 的函数。在这里,我们将主要使用 vector 和 iomanip 库来实现 Base64。Vector 库包含有用数据结构和函数的定义和实现,而 iomanip 是一个库,主要用于操纵 C++ 程序的输出。

此代码基本上将每个字符转换为其相应的 Base64 成本并将其追加到输出字符串中。类似地,解密功能将每个 Base64 字符转换回其唯一值并将其追加到输出字符串中。这样,原始字符串就会被重建。

示例

以下是使用 C++ 的实现

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <sstream>

std::string base64_encode(const std::string &in) {
   std::string out;

   std::string base64_chars =
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      "abcdefghijklmnopqrstuvwxyz"
      "0123456789+/";

   int val = 0, valb = -6;
   for (unsigned char c : in) {
      val = (val << 8) + c;
      valb += 8;
      while (valb >= 0) {
         out.push_back(base64_chars[(val >> valb) & 0x3F]);
         valb -= 6;
      }
   }
   if (valb > -6)
      out.push_back(base64_chars[((val << 8) >> (valb + 8)) & 0x3F]);
   while (out.size() % 4)
      out.push_back('=');
   return out;
}

std::string base64_decode(const std::string &in) {
   std::string out;

   std::string base64_chars =
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      "abcdefghijklmnopqrstuvwxyz"
      "0123456789+/";

   std::vector<int> base64_reverse_chars(256, -1);
   for (int i = 0; i < 64; i++) {
      base64_reverse_chars[base64_chars[i]] = i;
   }

   int val = 0, valb = -8;
   for (unsigned char c : in) {
      if (base64_reverse_chars[c] == -1)
         break;
      val = (val << 6) + base64_reverse_chars[c];
      valb += 6;
      if (valb >= 0) {
         out.push_back(char((val >> valb) & 0xFF));
         valb -= 8;
      }
   }
   return out;
}

int main() {
   std::string plaintext = "Hello, Everyone. This world is beautiful!";
   std::string es = base64_encode(plaintext);
   std::cout << "The Encoded string: " << es << std::endl;

   std::string ds = base64_decode(es);
   std::cout << "The Decoded string: " << ds << std::endl;

   return 0;
}

以下是上述示例的输出:

输入/输出

The Encoded string: SGVsbG8sIEV2ZXJ5b25lLiBUaGlzIHdvcmxkIGlzIGJlYXV0aWZ1bCE=
The Decoded string: Hello, Everyone. This world is beautiful!

优势

使用异或加密过程加密消息有一些优势 -

  • 异或加密非常简单易于实现和理解。

  • 此方法计算效率高,使其成为一种快速的加密方法。

  • 异或加密是一种对称加密,因此与非对称加密方法相比,它简化了密钥管理。

  • 它可以通过使用不同的密钥轻松自定义,从而允许各种加密变化。

缺点

以下是需要注意的一些异或加密的缺点 -

  • 异或加密需要一个安全的密钥交换过程来确保密钥的机密性。

  • 它容易受到已知明文攻击,攻击者可以在其中猜测明文和密文中模式以获取密钥或解密其他消息。

  • 在这种技术中,我们对多个消息重复使用相同的密钥。这会削弱异或加密的安全性。

  • 它不适合加密大量数据,因为它缺乏像 AES 这样的现代加密算法提供的安全功能。

广告