当前位置: 首页 > 知识库问答 >
问题:

C#AES CBC PKCS7到Python

慕宜民
2023-03-14

我目前试图翻译一个简单的AES代码从C#到Python。我对这两种语言都很了解,但是我对加密领域(尤其是AES)一无所知。我以前用C#写过这个AES代码,但是现在我不知道如何在Python中工作(我使用PyCrypto,因为Python2.7没有内置的AES)。下面是我的C#代码:

using System.Collections;
using System.Text;
using System.Security.Cryptography;

namespace DefaultClasses
{
    public class SimpleAES
    {
        private const string KEY = "someKey";
        private const string IV = "someIV";
        private AesCryptoServiceProvider _aes;
        private ICryptoTransform _crypto;

        public SimpleAES()
        {
            _aes = new AesCryptoServiceProvider();
            _aes.BlockSize = 128;
            _aes.KeySize = 256;
            _aes.Key = ASCIIEncoding.ASCII.GetBytes(KEY);
            _aes.IV = ASCIIEncoding.ASCII.GetBytes(IV);
            _aes.Padding = PaddingMode.PKCS7;
            _aes.Mode = CipherMode.CBC;
        }

        public string encrypt(string message)
        {
            _crypto = _aes.CreateEncryptor(_aes.Key, _aes.IV);
            byte[] encrypted = _crypto.TransformFinalBlock(
                ASCIIEncoding.ASCII.GetBytes(message), 0, ASCIIEncoding.ASCII.GetBytes(message).Length);
            _crypto.Dispose();
            return System.Convert.ToBase64String(encrypted);
        }

        public string decrypt(string message)
        {
            _crypto = _aes.CreateDecryptor(_aes.Key, _aes.IV);
            byte[] decrypted = _crypto.TransformFinalBlock(
                System.Convert.FromBase64String(message), 0, System.Convert.FromBase64String(message).Length);
            _crypto.Dispose();
            return ASCIIEncoding.ASCII.GetString(decrypted);
        }
    }
}

请注意,对于Python,我还需要BlockSize=128、KeySize=256、Padding=PKCS7和Cipher CBC。提前感谢!

共有1个答案

慎星纬
2023-03-14

我意识到这个问题已经有将近一年的历史了,但是我在寻找一些解决方案来与在AES实现中使用PKCS7填充的遗留窗口进程进行通信时发现了这个问题。这里有一个非常适合我的快速例子。希望它能对以后的其他人有用。我有与问题作者指定的相同的块大小、键大小和填充。

from Crypto.Cipher import AES
from pkcs7 import PKCS7Encoder
import base64

shared_key = "abc123ty9TW1abc123ty9TW1" #some random key for a working example
IV = "rTF25nTrrTF25nTr" 

clear_text = "Testing 123"
aes = AES.new(shared_key, AES.MODE_CBC, IV)
aes.block_size = 128
cipher_text = base64.b64encode(aes.encrypt(PKCS7Encoder().encode(clear_text)))
print(cipher_text)

aes_decrypter = AES.new(shared_key, AES.MODE_CBC, IV)
aes_decrypter.block_size = 128
clear_text = PKCS7Encoder().decode(aes_decrypter.decrypt(base64.b64decode(cipher_text)))
print(clear_text)

我使用的pkcs7填充实用程序是从Github项目复制的:

import binascii
import StringIO

class PKCS7Encoder(object):
    def __init__(self, k=16):
       self.k = k

    ## @param text The padded text for which the padding is to be removed.
    # @exception ValueError Raised when the input padding is missing or corrupt.
    def decode(self, text):
        '''
        Remove the PKCS#7 padding from a text string
        '''
        nl = len(text)
        val = int(binascii.hexlify(text[-1]), 16)
        if val > self.k:
            raise ValueError('Input is not padded or padding is corrupt')

        l = nl - val
        return text[:l]

    ## @param text The text to encode.
    def encode(self, text):
        '''
        Pad an input string according to PKCS#7
        '''
        l = len(text)
        output = StringIO.StringIO()
        val = self.k - (l % self.k)
        for _ in xrange(val):
            output.write('%02x' % val)
        return text + binascii.unhexlify(output.getvalue())
 类似资料:
  • 问题内容: 我已经使用C#,更广泛地使用.Net框架已有两年了。我经常听说C#和Java语言之间的相似之处,并且想了解有关第二种语言的更多信息。 来自C#时,您对学习Java有任何具体建议吗? C#程序员在启动Java时会发生任何常见错误吗? 是否有任何文档显示了您可以保留的习惯和必须改变的习惯(仍然在C#到Java的可视性中,所以比C#与Java的比较要具体一些) 问题答案: 好吧,尽管C#和J

  • 问题内容: 我想将DataTable作为Json格式显示在图表上。 如何将DataTable转换为Json? 谢谢。 问题答案: 您可以使用JSON.NET将数据表(在许多其他类型中!)自动序列化为JSON。

  • 我正在将一个程序从C#转换为VB.NET,并且一切工作都很好。现在剩下的1行代码似乎无法转换到VB.NET。如果有人能帮我就好了。 C#代码: 我就是这样试的: 对于“num2-10+65”,它给出了错误代码: “整数值无法转换为字符” . 我做错了什么? 更新:我自己把CChar改成chr。就是这样。 固定代码:

  • 本文向大家介绍cython 包装DLL:从C ++到Cython到Python,包括了cython 包装DLL:从C ++到Cython到Python的使用技巧和注意事项,需要的朋友参考一下 示例 这展示了一个用Cython包装C ++ dll的简单例子。它将涵盖以下主要步骤: 使用Visual Studio使用C ++创建示例DLL。 用Cython包裹DLL,以便可以在Python中调用它。

  • 问题内容: 用Java在字典中可以声明已经声明的项目吗?就像下面的C#代码一样: 我该怎么办?我要使用哪种类型?我读过字典已过时。 问题答案: 这将做您想要的: 该语句创建HashMap的匿名子类,与父类的唯一区别是在实例创建过程中添加了4个条目。在Java世界中,这是一个相当普遍的习惯用法(尽管有些人有争议,因为它创建了一个新的类定义)。 由于这一争议,从Java 9开始,有一个新的惯用法来方便

  • 我在Visual Studio中创建了一个项目,2013年。 项目文件具有以下属性: ToolsVersion=“12.0”,PlatformToolset=v120。 我安装了Visual Studio 2013和Microsoft Build Tools 2015。此项目使用MSBuild 12.0成功构建。在试图构建它与MSBuild 14.0我得到一个错误 据我所知,问题在于变量VCTar