2015-07-02 21 views
6

C kodunda iki SHA1 yaptım, biri dize için, diğeri bir tamsayı için ve farklı sonuç alıyor. python'daPython SHA1 Tamsayı

SHA_init(&ctx); 
SHA_update(&ctx, "1234", 4); 
sha = SHA_final(&ctx); 

unsigned n = 1234; 
SHA_init(&ctx); 
SHA_update(&ctx, &n, sizeof(n)); 
sha = SHA_final(&ctx); 

string result: 7110eda4d09e62aa5e4a390b0a572acd2c220 
integer result: c7f07b846cc46631c2079cdd7179afdd783d643 

kadarı dize sonuç C kodu ile aynıdır görebilirsiniz dize SHA1

sha1 = hashlib.sha1() 
sha1.update('1234') 
sha1.hexdigest() 

'7110eda4d09e062aa5e4a390b0a572ac0d2c0220' 

almak çok kolaydır. Peki python'da tamsayı SHA1 nasıl elde edilir? çünkü python sha1 tam sayıyı desteklemez.

Aşağıdaki kodu denedim, ancak C koduyla aynı sonucu alamıyor.

aint = unpack('>4B', pack('>I', 1234)) 
sha1 = hashlib.sha1() 
sha1.update(bytearray(aint)) 
sha1.hexdigest() 

'ac9928e78cf6ea117451ecd6654fea2adae73e21'

nasıl Python tamsayı SHA1 yapmalı?

+0

İpucu: 'map (ord," 1234 ") == [49, 50, 51, 52]! = [210, 4] == [1234 & 0xff, 1234 >> 8]' – kay

+0

sha sha1 hakkında ne dersiniz?Güncelleştirme (str (1234)) '? – ycsun

+0

Elbette, sha1.update (str (1234)) 'sha1.update ('1234')' ile aynıdır. –

cevap

2

Sonuçlarınızı C'de yeniden oluşturamıyorum, hangi SHA kitaplığını kullanıyorsunuz? OpenSSL, SHA1_* işlevlerini önerir ancak uyumluluk için SHA_*'un dahil edildiğini belirtir. Eğer pitonlar SHA1 karşılaştırarak yapıyorsanız, SHA1_*

#include <openssl/sha.h> 
#include <stdio.h> 

int main(void) { 
    unsigned n = 1234; 
    unsigned char md[50]; 
    SHA_CTX c; 

    for (int i=0; i<sizeof(n); i++) { 
     printf("%02x ", ((unsigned char*)&n)[i]); 
    } 
    printf("\n"); 

    SHA1_Init(&c); 
    SHA1_Update(&c, &n, 4); 
    SHA1_Final(md, &c); 

    for (int i=0; i<20; i++) { 
     printf("%02x", md[i]); 
    } 
    printf("\n"); 
    return 0; 
} 

kullanıyor olmalıdır böylece bu iki, benim için farklı sonuçlar verir verir: Eğer yanlış bayt Toplanıyorsun düşündürmektedir

d2 04 00 00 
7b08e025e311c3dfcf5179b67c0fdc08e73de261 

python uygulamanızda sipariş verin. Olmalıdır:

>>> import hashlib 
>>> hashlib.sha1(b'\xd2\x04\x00\x00').hexdigest() 
'7b08e025e311c3dfcf5179b67c0fdc08e73de261' 
>>> hashlib.sha1(bytearray(unpack('>4B', pack('I', 1234)))).hexdigest() 
'7b08e025e311c3dfcf5179b67c0fdc08e73de261' 

yukarıdaki shasum maçları hangi (I önünde hiçbir > unutmayın).

>>> hashlib.new('sha', b'\xd2\x04\x00\x00').hexdigest() 
'3e491ac1d065d6d666e5e216e0cddf60fcb5be86' 
+0

Cevabınız için teşekkür ederiz. SHA'yı android kodundan kullandım. https://github.com/android/platform_system_core/blob/master/libmincrypt/sha.c. Ama SHA dizisinin eşleşmesi garip. –

+0

Ve hashlib.sha1 (bytearray (paketten çıkar ('> 4B', paket ('I', 1234)))) hexdigest() 'python'da tamsayı yapmak için doğru işlevdir? Teşekkürler. –

1

O çekebilir: Ben SHA_* işlevlerini kullanın eğer SHA ("SHA-0") Python değer yaramış

int main(void) { 
    unsigned n = 1234; 
    unsigned char md[50]; 
    SHA_CTX c; 

    SHA_Init(&c); 
    SHA_Update(&c, &n, 4); 
    SHA_Final(md, &c); 

    for (int i=0; i<20; i++) { 
     printf("%02x", md[i]); 
    } 
    printf("\n"); 
    return 0; 
} 

3e491ac1d065d6d666e5e216e0cddf60fcb5be86 

olsun Başvuru için

, yazdırma için onaltılık dönüştüren kodunuz. Çekirdeklerinden hiçbirinin 40 karakter uzunluğuna dikkat edin? Aşağıdaki to_hex() yöntemimi kullanmayı deneyin.

python ==> '7110eda4d09e062aa5e4a390b0a572ac0d2c0220' 
string result: 7110eda4d09e62aa5e4a390b0a572acd2c220 
integer result: c7f07b846cc46631c2079cdd7179afdd783d643 

Ayrıca C sonuçlarınızı da üretemedim. İşte bir OSX sürümü:

#include <stdio.h> 
#include <CommonCrypto/CommonDigest.h> 

char *to_hex(unsigned char *buffer, size_t len) { 
    static char out[100]; 
    char *p = out; 
    while (len--) 
    p += sprintf(p, "%02x", *buffer++); 
    *p = 0; 
    return out; 
} 

int main() { 
    unsigned char buffer[21] = { 0 }; 
    printf("SHA1(\"1234\") = %s\n", to_hex(CC_SHA1("1234", 4, buffer), 20)); 

    unsigned n = 1234; 
    printf("1234 LE =  %s\n", to_hex(&n, 4)); 
    printf("SHA1(1234 LE) = %s\n", to_hex(CC_SHA1(&n, 4, buffer), 20)); 

    n = htonl(n); 
    printf("1234 BE =  %s\n", to_hex(&n, 4)); 
    printf("SHA1(1234 BE) = %s\n", to_hex(CC_SHA1(&n, 4, buffer), 20)); 

    return 0; 
} 

ve burada dosya system/core/libmincrypt içindedir Android sürümü

#include <stdio.h> 
#include "mincrypt/sha.h" 

char *to_hex(unsigned char *buffer, size_t len) { 
    static char out[100]; 
    char *p = out; 
    while (len--) 
    p += sprintf(p, "%02x", *buffer++); 
    *p = 0; 
    return out; 
} 

int main() { 
    unsigned char buffer[21] = { 0 }; 
    printf("SHA1(\"1234\") = %s\n", to_hex(SHA1_hash("1234", 4, buffer), 20)); 

    unsigned n = 1234; 
    printf("1234 LE =  %s\n", to_hex(&n, 4)); 
    printf("SHA1(1234 LE) = %s\n", to_hex(SHA1_hash(&n, 4, buffer), 20)); 

    n = htonl(n); 
    printf("1234 BE =  %s\n", to_hex(&n, 4)); 
    printf("SHA1(1234 BE) = %s\n", to_hex(SHA1_hash(&n, 4, buffer), 20)); 

    return 0; 
} 

var ve her iki program aynı sonuçlar elde cc -I../include -o sha_test sha_test.c sha.c

ile derlenmiş

SHA1("1234") = 7110eda4d09e062aa5e4a390b0a572ac0d2c0220 
1234 LE =  d2040000 
SHA1(1234 LE) = 7b08e025e311c3dfcf5179b67c0fdc08e73de261 
1234 BE =  000004d2 
SHA1(1234 BE) = ac9928e78cf6ea117451ecd6654fea2adae73e21 
+1

Üzgünüm, test kodumun bazı sorunları var, n değiştirildi. Bu hatayı düzelttikten sonra SHA C koduna hizalanır. Hepinize teşekkürler –

2
digest = sha1.hexdigest() 
digest_int = int(digest,16) 
+0

Bu kod soruyu yanıtlarken, sorunun nasıl ve/veya neden çözüldüğüne ilişkin ek bağlam sağlayarak yanıtın uzun vadeli değerini artıracaktır. –