Python 3.x 根据ISO 9797 Alg3从纯文本生成MAC
我需要生成基于ISO 9797 Alg3从纯文本的MAC。我已经用“BouncyCastle”工具用java和C#编写了一个相同的函数,非常简单,如下代码所示。但是,互联网上没有任何python示例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
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密码创建算法 所有操作都是在字节或字节数组上进行的
好吧,既然答案被接受了,我将放弃不发布示例代码的警告,发布我自己的代码,只是为了展示良好的编程实践(只要我能够用我对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())