Нужна помощь в преобразовании C# "Byte Math" в Python - PullRequest
0 голосов
/ 08 апреля 2020

У нас есть старый, нестандартный C# алгоритм хэширования, который мы используем для маскировки адресов электронной почты в целях PII. Я пытаюсь построить Python версию этого алгоритма, но я изо всех сил пытаюсь справиться с различиями в том, как C# и Python обрабатывают байты / байтовые массивы, создавая, таким образом, неправильное значение ha sh. Для справки: Python 2,7, но решение Python 3+ будет работать так же хорошо.

C# код:

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

public class Program
{
    public static void Main()
    {
        string emailAddressStr = "my@email.com";
        emailAddressStr = emailAddressStr.Trim().ToLower();
        SHA256 objCrypt = new SHA256Managed();
        byte[] b = (new ASCIIEncoding()).GetBytes(emailAddressStr);
        byte[] bRet = objCrypt.ComputeHash(b);

        string retStr = "";
        byte c;

        for (int i = 0; i < bRet.Length; i++)
        {
            c = (byte)bRet[i];
            retStr += ((char)(c / 10 + 97)).ToString().ToLower();
            retStr += ((char)(c % 10 + 97)).ToString().ToLower();
        }
        Console.WriteLine(retStr);
    }
}

(правильное) значение, которое возвращается uhgbnaijlgchcfqcrgpicdvczapepbtifiwagitbecjfqalhufudieofyfdhzera

Python перевод:

import hashlib

emltst = "my@email.com"

emltst = emltst.strip().lower()
b = bytearray(bytes(emltst).encode("ascii"))
bRet = bytearray(bytes(hashlib.sha256(b)))

emailhash=""

for i in bRet:
    c = bytes(i)
    emailhash = emailhash + str(chr((i / 10) + 97)).lower()
    emailhash = emailhash + str(chr((i % 10) + 97)).lower()

print(emailhash)

(неправильное) значение, которое я здесь получаю, galfkejhfafdfedchcgfidhcdclbjikgkbjjlgdcgedceimaejeifakajhfekceifggc

«бизнес-конец» код в l oop, где c плохо переводит между языками. C# создает числовое значение c для расчета, но в Python, c - это строка (поэтому я использую i). Я прошел через оба набора кода и знаю, что я получаю одинаковое значение ha sh прямо перед l oop. Я надеюсь, что кто-то здесь сможет мне помочь. TIA!

EDIT (2020-04-09)

Oguz Ozgul предлагает хорошее решение ниже. На работе я нашел опытного программиста, который предложил это рабочее решение Python 3 (оно содержит код для более широкого решения по составлению списка электронных писем и использованию PySpark для написания таблицы):

myfile=sys.argv[1]
with open(myfile) as fql:
    insql=fql.read()

emails=[]
emails=insql.splitlines()

mytable=sys.argv[2]

def getSha256Hash(email):
    b = bytearray(bytes(email, 'ascii'))
    res = hashlib.sha256(b)
    bRet = bytearray.fromhex(res.hexdigest())
    emailhash=""
    for i in bRet:
        c1 = i / 10 + 97
        c2 = i % 10 + 97
        c1 = int(c1)
        c2 = int(c2)
        emailhash = emailhash + str(chr(c1)).lower()
        emailhash = emailhash + str(chr(c2)).lower()
    return(emailhash)
###################################

emailhashes = []

isascii = lambda s: len(s) == len(s.encode())

for e in emails:
    e = e.strip().lower()
    if isascii(e) == True:
        emailhashret = getSha256Hash(e)
        emailhashes.append(emailhashret)

findf = spark.createDataFrame(emailhashes, StringType())

spark.sql("SET spark.sql.hive.convertMetastoreParquet=false")

findf.repartition(1).write.format("parquet").mode("overwrite").saveAsTable(mytable)

1 Ответ

1 голос
/ 08 апреля 2020

Здесь вы go (python 3.0)

Примечания:

  1. hashAlgorithm.update ожидает закодированную строку, следовательно, b "my@email.com"
  2. chr ((i / 10) + 97 завершается с ошибкой «ожидаем, что найденное число с плавающей точкой», следовательно, //

import hashlib

emltst = b"my@email.com"

emltst = emltst.strip().lower()

hashAlgorithm = hashlib.sha256()
hashAlgorithm.update(emltst)
# Thanks to Mark Meyer for pointing out.
# bytearray(bytes( are redundant
bRet = hashAlgorithm.digest()

emailhash=""

for i in bRet:
    c = bytes(i)
    emailhash = emailhash + str(chr((i // 10) + 97)).lower()
    emailhash = emailhash + str(chr((i % 10) + 97)).lower()

print(emailhash)

ВЫХОД:

uhgbnaijlgchcfqcrgpicdvczapepbtifiwagitbecjfqalhufudieofyfdhzera                                                      
...