मुझे sha 256 के साथ-साथ शा 512 के बारे में उत्तर दें। संक्षेप में: एल्गोरिदम स्वयं एंडियन अज्ञेयवादी है। एंडियन संवेदनशील भाग तब होते हैं जब डेटा बाइट बफर से एल्गोरिदम कार्यशील चर में आयात किया जाता है और जब इसे पाचन परिणाम पर वापस निर्यात किया जाता है - एक बाइट बफर भी। अगर आयात/निर्यात में कास्टिंग शामिल है, तो एंडियन मामलों।
कहां कास्टिंग हो सकता है: शा 512 में 128 बाइट्स का एक कार्य बफर है। मेरी कोड में इस तरह अपने परिभाषित:
union
{
U64 w [80]; (see U64 example below)
byte buffer [128];
};
इनपुट डेटा इस बाइट बफर में कॉपी किया जाता है और फिर काम डब्ल्यू पर किया जाता है इसका मतलब यह है डेटा कुछ 64 बिट प्रकार के casted था। इस डेटा को स्वैप करना होगा। मेरे मामले में यह छोटी एंडियन मशीनों के लिए बदल गया।
एक बेहतर तरीका एक मैक्रो तैयार करने के लिए होगा जो प्रत्येक बाइट लेता है और इसे u64 प्रकार में सही जगह पर रखता है।
जब एल्गोरिदम किया जाता है तो पाचन परिणाम कुछ बाइट बफर में काम करने वाले चर से आउटपुट होता है, अगर यह memcpy द्वारा किया जाता है तो इसे भी बदलना होगा।
शाही 512 को लागू करते समय एक और कास्टिंग हो सकता है - जिसे 32 बिट मशीनों पर 64 बिट मशीनों के लिए डिज़ाइन किया गया है।इस प्रकार,
typedef struct {
uint high;
uint low;
} U64;
मान लें मैं भी थोड़ा endian के लिए इसे परिभाषित:
typedef struct {
uint low;
uint high;
} U64;
और फिर कश्मीर एल्गोरिथ्म init इस तरह से किया जाता है मेरे मामले में मैं एक 64 बिट प्रकार है कि परिभाषित किया गया है है :
static const SHA_U64 k[80] =
{
{0xD728AE22, 0x428A2F98}, {0x23EF65CD, 0x71374491}, ...
...
...
}
लेकिन मुझे किसी भी मशीन में समान होने के लिए [0] के तर्क मूल्य की आवश्यकता है। तो इस उदाहरण में मुझे उच्च और निम्न मानों के साथ एक और के सरणी की आवश्यकता होगी।
डेटा पैरामीटर पैरामीटर में संग्रहीत करने के बाद किसी भी बिटवाई मैनिपुलेशन के परिणामस्वरूप बड़ी/छोटी एंडियन मशीनों पर एक ही परिणाम होगा।
किसी भी कास्टिंग से बचने के लिए अच्छी विधि होगी: मैक्रो का उपयोग करके इनपुट बफर से इनपुट बफर में बाइट आयात करें। स्मृति मैपिंग के बारे में सोचने के बिना तार्किक मूल्यों के साथ काम करें। एक मैक्रो के साथ परिणाम पचाने के लिए निर्यात आउटपुट।
एक बाइट बफर से 32 बिट लेने int32 करने के लिए मैक्रो (बीई = बड़ा endian):
#define GET_BE_BYTES_FROM32(a)
((((NQ_UINT32) (a)[0]) << 24) |
(((NQ_UINT32) (a)[1]) << 16) |
(((NQ_UINT32) (a)[2]) << 8) |
((NQ_UINT32) (a)[3]))
#define GET_LE_BYTES_FROM32(a)
((((NQ_UINT32) (a)[3]) << 24) |
(((NQ_UINT32) (a)[2]) << 16) |
(((NQ_UINT32) (a)[1]) << 8) |
((NQ_UINT32) (a)[0]))
यह मुश्किल ... हालांकि सामान्य रूप में, SHA endianness के बारे में परवाह नहीं करता है। हैश के लिए, कोई इनपुट द्विआधारी "ब्लॉब" के 512 बिट ब्लॉक का एक बहु है (यदि आवश्यक हो, तो यह पैडिंग जोड़ देगा)। अंदरूनी, अंतहीनता महत्वहीन है। दूसरी तरफ, यदि आपके पास उदाहरण के लिए एक बार 'संरचना' है और एक बार बड़े एंडियन में है, और आप उन्हें हैश करते हैं, तो वे निश्चित रूप से विभिन्न हैंश का उत्पादन करेंगे। लेकिन ऐसा इसलिए है क्योंकि वे अलग-अलग द्विआधारी डेटा हैं, न कि हैश की परवाह है। – Damon
@ डैमन: हाँ अच्छा बिंदु। – Heisenbug
कृपया मेरा संपादन देखें –