Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 根据ISO 9797 Alg3从纯文本生成MAC_Python 3.x_Cryptography - Fatal编程技术网

Python 3.x 根据ISO 9797 Alg3从纯文本生成MAC

Python 3.x 根据ISO 9797 Alg3从纯文本生成MAC,python-3.x,cryptography,Python 3.x,Cryptography,我需要生成基于ISO 9797 Alg3从纯文本的MAC。我已经用“BouncyCastle”工具用java和C#编写了一个相同的函数,非常简单,如下代码所示。但是,互联网上没有任何python示例 using System.Text; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Macs; using System.S

我需要生成基于ISO 9797 Alg3从纯文本的MAC。我已经用“BouncyCastle”工具用java和C#编写了一个相同的函数,非常简单,如下代码所示。但是,互联网上没有任何python示例

using System.Text;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Macs;
using System.Security.Cryptography;
using System.IO;

namespace TestGenerateMAC2
{
    class Program
    {
        public static string getMac(string text, string key)
        {
            byte[] keyBytes = StringToByteArray(key);
            byte[] data = Encoding.UTF8.GetBytes(text);
            DesEngine cipher = new DesEngine();
            ISO9797Alg3Mac mac = new ISO9797Alg3Mac(cipher);

            KeyParameter keyP = new KeyParameter(keyBytes);
            mac.Init(keyP);
            mac.BlockUpdate(data, 0, data.Length);

            byte[] outPut = new byte[8];

            mac.DoFinal(outPut, 0);

            return BytesToHex(outPut);
        }
        public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }

        public static string BytesToHex(byte[] bytes)
        {
            return String.Concat(Array.ConvertAll(bytes, delegate (byte x) { return x.ToString("X2"); })).ToLower();
        }

  }
}

python中是否有相同的示例

请求样本显然是离题的,但我将说明如何使用DES CBC和DES ECB密码创建算法

所有操作都是在字节或字节数组上进行的

  • 将16字节密钥拆分为密钥A和密钥B
  • 使用密钥A和8字节的全零IV初始化DES CBC加密
  • 迭代消息中的所有完整块&对于每个块,执行CBC加密,丢弃结果(使用相同的密码实例,您毕竟需要保持状态)
  • 创建最后一个块,并将消息中剩余的字节复制到其中
  • 在下一个位置添加初始填充指示器字节
  • 通过加密最后一个块来完成CBC加密,并保留结果
  • 使用密钥B对结果执行DES ECB解密,替换结果
  • 使用密钥A对结果进行加密,替换结果
  • 然后当然返回结果

    。。。快乐编程


    好吧,既然答案被接受了,我将放弃不发布示例代码的警告,发布我自己的代码,只是为了展示良好的编程实践(只要我能够用我对Python的理解创建这些实践):

    请注意,上述代码中DES/cipher对象的API文档没有明确说明返回了什么数据以及何时返回。因此,我加入了一个
    if
    语句来检索当前实现显然不需要的最后一块密文。这可能过于谨慎了(但这是加密域带来的)

    还要注意,我已经为消息本身之外的填充创建了最后一个块。填充消息本身既危险(您可能希望将消息用于其他方式)又占用大量资源,因为复制大型消息是个坏主意。

    谢谢Maarten

    我根据你的描述找到并更改了一个代码。下面的代码解决了我的问题

    多谢各位

    import sys
    from Crypto.Cipher import DES
    from Crypto.Cipher import DES3
    from Crypto.Util.strxor import strxor
    import binascii
    
    
    def macIso9797_m2_alg3(key, msg):
        return macIso9797_alg3(key, msg, "80")
    
    def macIso9797_m1_alg3(key, msg):
        return macIso9797_alg3(key, msg, "00")
    
    def macIso9797_alg3(key, msg, pad_start):
    
        key_len = int(len(key)/2)    
    
        if (key_len != 16):
            raise ValueError("Key length should be 16 digits")    
    
        # force header  padding
        msg += pad_start
    
        # padding with "00"
        lenRestOfData = int((len(msg)/2) % 8)
        msg += "00"*(8-lenRestOfData)
    
        loopNum = int((len(msg)/2) / 8)
    
        bufferOutput = binascii.unhexlify("00"*8)
        IV = '\x00'*8    
    
        keya = binascii.unhexlify(key[0:16])
        keyb = binascii.unhexlify(key[16:])
    
        i = 0
        for i in range (0, loopNum):
            tdesa = DES.new(keya, DES.MODE_ECB)
    
            data = msg[i*16:i*16+16]
    
            x = bufferOutput
            bufferOutput = strxor(binascii.unhexlify(data), bufferOutput)
    
            bufferOutput = tdesa.encrypt(bufferOutput)
    
        tdesb = DES.new(keyb, DES.MODE_ECB)
        bufferOutput = tdesb.decrypt(bufferOutput)
    
        tdesa = DES.new(keya, DES.MODE_ECB)
        bufferOutput = tdesa.encrypt(bufferOutput)
    
        return bufferOutput
    
    
    macKey="mac key"
    message="text message"
    
    hexMessage = bytes(message, encoding='utf-8').hex()
    
    print('MAC Key: ' + macKey)
    print('MAC: ' + macIso9797_m1_alg3(macKey, hexMessage).hex())
    
    import sys
    from Crypto.Cipher import DES
    from Crypto.Cipher import DES3
    from Crypto.Util.strxor import strxor
    import binascii
    
    
    def macIso9797_m2_alg3(key, msg):
        return macIso9797_alg3(key, msg, "80")
    
    def macIso9797_m1_alg3(key, msg):
        return macIso9797_alg3(key, msg, "00")
    
    def macIso9797_alg3(key, msg, pad_start):
    
        key_len = int(len(key)/2)    
    
        if (key_len != 16):
            raise ValueError("Key length should be 16 digits")    
    
        # force header  padding
        msg += pad_start
    
        # padding with "00"
        lenRestOfData = int((len(msg)/2) % 8)
        msg += "00"*(8-lenRestOfData)
    
        loopNum = int((len(msg)/2) / 8)
    
        bufferOutput = binascii.unhexlify("00"*8)
        IV = '\x00'*8    
    
        keya = binascii.unhexlify(key[0:16])
        keyb = binascii.unhexlify(key[16:])
    
        i = 0
        for i in range (0, loopNum):
            tdesa = DES.new(keya, DES.MODE_ECB)
    
            data = msg[i*16:i*16+16]
    
            x = bufferOutput
            bufferOutput = strxor(binascii.unhexlify(data), bufferOutput)
    
            bufferOutput = tdesa.encrypt(bufferOutput)
    
        tdesb = DES.new(keyb, DES.MODE_ECB)
        bufferOutput = tdesb.decrypt(bufferOutput)
    
        tdesa = DES.new(keya, DES.MODE_ECB)
        bufferOutput = tdesa.encrypt(bufferOutput)
    
        return bufferOutput
    
    
    macKey="mac key"
    message="text message"
    
    hexMessage = bytes(message, encoding='utf-8').hex()
    
    print('MAC Key: ' + macKey)
    print('MAC: ' + macIso9797_m1_alg3(macKey, hexMessage).hex())