Difference between revisions of "Talk:Cryptography"
Jump to navigation
Jump to search
wub--Aschratt 21:00, 17 February 2009 (UTC)
(16 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
+ | == Revision == | ||
+ | [[User:Wesser|Wesser]] I'm sorry to see that you reversed my edit. Was there something wrong with it? I'm rather confused as I thought I was clarifying the meaning of JAMCRC. – [[User:Squ1dd13|Squ1dd13]] ([[User talk:Squ1dd13|talk]]) 11:48, 18 August 2020 (UTC) | ||
+ | : I wish not to sound harsh, but your edit was simply redundant. – [[User:Wesser|Wesser]] ([[User talk:Wesser|talk]]) 17:05, 18 August 2020 (UTC) | ||
+ | :: That's fair enough then. OK. – [[User:Squ1dd13|Squ1dd13]] ([[User talk:Squ1dd13|talk]]) 17:32, 18 August 2020 (UTC) | ||
+ | :I actually find the removed addition useful. [[User:Seemann|Seemann]] ([[User talk:Seemann|talk]]) 05:14, 19 August 2020 (UTC) | ||
+ | ::Last information looked too obvious if you ask me, but unless you are ok with it, you are free to undo my edit. [[User:Wesser|Wesser]] ([[User talk:Wesser|talk]]) 12:40, 19 August 2020 (UTC) | ||
+ | :::I can't undo as the article has been changed since then. Squ1dd13, if you wish, add your edit back, possibly with a reference to an existing algorithm, e.g.[https://llvm.org/doxygen/JamCRC_8cpp_source.html] [https://github.com/llvm/llvm-project/blob/1e1e3ba2526ecab1ad3c18c97abef36df00b3813/llvm/include/llvm/Support/CRC.h#L28] [[User:Seemann|Seemann]] ([[User talk:Seemann|talk]]) 04:09, 20 August 2020 (UTC) | ||
+ | |||
+ | == AES == | ||
+ | |||
Can someone provide an example of how to decrypt GTA IV AES Encryption through C++ (Key doesn't necessarily have to be included)? | Can someone provide an example of how to decrypt GTA IV AES Encryption through C++ (Key doesn't necessarily have to be included)? | ||
: Done. Do we really need to include implementation code for all the common hashes, though? --[[User:Steve-m|Steve-m]] 15:11, 15 February 2009 (UTC) | : Done. Do we really need to include implementation code for all the common hashes, though? --[[User:Steve-m|Steve-m]] 15:11, 15 February 2009 (UTC) | ||
:: I think it's necessary for GTA's special CRC32 and One At A Time Hash (which I suppose isn't all that common). However I left SHA1 out because that is really common. Thanks for your decryption example, although do you have the library you used? --[[User:Sacky|Sacky]] | :: I think it's necessary for GTA's special CRC32 and One At A Time Hash (which I suppose isn't all that common). However I left SHA1 out because that is really common. Thanks for your decryption example, although do you have the library you used? --[[User:Sacky|Sacky]] | ||
+ | ::: No particular library, code is untested too. But there are tons of implementations that support those or similar functions, like [http://www.srcdoc.com/openssl_0.9.7g/crypto_2aes_2aes_8h.html OpenSSL], and usually every language/platform comes with its own library. Instead of decoding each block 16x you could as well decode all the data at once 16x (like aru does it), because of ECB that doesn't really matter (mathematically - although your CPU cache would be happier with the first method :p). --[[User:Steve-m|Steve-m]] 16:12, 16 February 2009 (UTC) | ||
+ | |||
+ | Please, can you post some code how to use AES Encryption in Delphi? | ||
+ | : Sure. I used a stripped down version of [http://www.google.com/search?q=AesLib.pas AesLib.pas], I forgot where I got it from. Actual AES code is implemented in C and included via pre-compiled object files. --[[User:Steve-m|Steve-m]] 13:55, 17 February 2009 (UTC) | ||
+ | |||
+ | <div class="NavFrame collapsed"><div class="NavHead">'''code snippet''' </div><div class="NavContent"><source lang="delphi">unit RockstarCrypt; | ||
+ | |||
+ | interface | ||
+ | |||
+ | const | ||
+ | CKeyLength = 32; | ||
+ | |||
+ | type | ||
+ | PAesKey = ^TAesKey; | ||
+ | TAesKey = array[0..CKeyLength-1] of byte; | ||
+ | |||
+ | procedure RockstarDecrypt(Data: Pointer; Size: cardinal); | ||
+ | |||
+ | implementation | ||
+ | |||
+ | uses AesLib; | ||
+ | |||
+ | procedure RockstarDecrypt(Data: Pointer; Size: cardinal); | ||
+ | const | ||
+ | CAesRounds = 16; // because it's 16x more secure!!1! | ||
+ | CAesKey: array[0..CKeyLength-1] of byte = ( | ||
+ | $1A, $B5, ... // put the full key here or load it from the exe | ||
+ | ); | ||
+ | var | ||
+ | AesCtx: TAesContext; | ||
+ | i, j: Cardinal; | ||
+ | p: Pointer; | ||
+ | begin | ||
+ | aes_set_decrypt_key(@CAesKey[0], CKeyLength, AesCtx); | ||
+ | |||
+ | for i := 0 to Size div 16 - 1 do begin | ||
+ | Cardinal(p) := Cardinal(Data) + i*16; | ||
+ | for j := 1 to CAesRounds do | ||
+ | aes_decrypt_block(p^, p^, AesCtx); | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | end.</source></div> | ||
+ | |||
+ | ::HUGE thanks!))) | ||
+ | |||
+ | == The "old" CRC32 algorithm from the [[GXT]] article == | ||
+ | |||
+ | <div class="NavFrame collapsed"><div class="NavHead">'''code snippet''' </div><div class="NavContent"><source lang="cpp-qt">class Checksum | ||
+ | { | ||
+ | private: | ||
+ | unsigned int m_aiCalcTable[265] = | ||
+ | { | ||
+ | 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, | ||
+ | 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, | ||
+ | 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, | ||
+ | 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, | ||
+ | 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, | ||
+ | 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, | ||
+ | 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, | ||
+ | 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, | ||
+ | 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, | ||
+ | 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, | ||
+ | 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, | ||
+ | 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, | ||
+ | 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, | ||
+ | 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, | ||
+ | 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, | ||
+ | 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, | ||
+ | 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, | ||
+ | 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, | ||
+ | 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, | ||
+ | 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, | ||
+ | 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, | ||
+ | 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, | ||
+ | 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, | ||
+ | 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, | ||
+ | 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, | ||
+ | 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, | ||
+ | 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, | ||
+ | 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, | ||
+ | 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, | ||
+ | 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, | ||
+ | 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, | ||
+ | 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, | ||
+ | 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, | ||
+ | 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, | ||
+ | 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, | ||
+ | 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, | ||
+ | 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, | ||
+ | 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, | ||
+ | 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, | ||
+ | 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, | ||
+ | 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, | ||
+ | 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, | ||
+ | 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, | ||
+ | 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, | ||
+ | 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, | ||
+ | 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, | ||
+ | 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, | ||
+ | 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, | ||
+ | 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, | ||
+ | 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, | ||
+ | 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, | ||
+ | 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, | ||
+ | 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, | ||
+ | 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, | ||
+ | 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, | ||
+ | 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, | ||
+ | 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, | ||
+ | 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, | ||
+ | 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, | ||
+ | 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, | ||
+ | 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, | ||
+ | 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, | ||
+ | 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, | ||
+ | 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D, | ||
+ | }; | ||
+ | |||
+ | public: | ||
+ | static void generateChecksumFromString(std::string source, bool caseSensitive, unsigned int &checksum) | ||
+ | { | ||
+ | checksum = 0xFFFFFFFF; | ||
+ | |||
+ | if(!caseSensitive) | ||
+ | { | ||
+ | toUpperCase(source); | ||
+ | } | ||
+ | |||
+ | for(unsigned int i = 0; i < source.size(); i++) | ||
+ | { | ||
+ | checksum = m_aiCalcTable[(checksum ^ source[i]) & 0xFF] ^ ((checksum >> 8) & 0x00FFFFFF); | ||
+ | } | ||
+ | } | ||
+ | };</source></div> wub--[[User:Aschratt|Aschratt]] 21:00, 17 February 2009 (UTC) | ||
+ | |||
+ | == PS3 version key == | ||
+ | |||
+ | It seems that PS3 version of GTA4 is using same key. Found inside of EBOOT.BIN after decrypting it. [[User:JoKiv|JoKiv]] 13:00, 2 June 2011 (UTC) | ||
+ | |||
+ | : All GTA IV (and Episodes too) games on all platforms uses the same key. [[User:GooD-NTS|GooD-NTS]] | ||
+ | |||
+ | == One at a time hash implementation == | ||
+ | |||
+ | The one on the page converts everything to lowercase while the official one does not, is that a GTA-specific version? And "hashchr" isn't defined anywhere in that code. |
Latest revision as of 04:14, 20 August 2020
Contents
Revision
Wesser I'm sorry to see that you reversed my edit. Was there something wrong with it? I'm rather confused as I thought I was clarifying the meaning of JAMCRC. – Squ1dd13 (talk) 11:48, 18 August 2020 (UTC)
- I wish not to sound harsh, but your edit was simply redundant. – Wesser (talk) 17:05, 18 August 2020 (UTC)
- I actually find the removed addition useful. Seemann (talk) 05:14, 19 August 2020 (UTC)
AES
Can someone provide an example of how to decrypt GTA IV AES Encryption through C++ (Key doesn't necessarily have to be included)?
- Done. Do we really need to include implementation code for all the common hashes, though? --Steve-m 15:11, 15 February 2009 (UTC)
- I think it's necessary for GTA's special CRC32 and One At A Time Hash (which I suppose isn't all that common). However I left SHA1 out because that is really common. Thanks for your decryption example, although do you have the library you used? --Sacky
- No particular library, code is untested too. But there are tons of implementations that support those or similar functions, like OpenSSL, and usually every language/platform comes with its own library. Instead of decoding each block 16x you could as well decode all the data at once 16x (like aru does it), because of ECB that doesn't really matter (mathematically - although your CPU cache would be happier with the first method :p). --Steve-m 16:12, 16 February 2009 (UTC)
- I think it's necessary for GTA's special CRC32 and One At A Time Hash (which I suppose isn't all that common). However I left SHA1 out because that is really common. Thanks for your decryption example, although do you have the library you used? --Sacky
Please, can you post some code how to use AES Encryption in Delphi?
- Sure. I used a stripped down version of AesLib.pas, I forgot where I got it from. Actual AES code is implemented in C and included via pre-compiled object files. --Steve-m 13:55, 17 February 2009 (UTC)
code snippet
unit RockstarCrypt;
interface
const
CKeyLength = 32;
type
PAesKey = ^TAesKey;
TAesKey = array[0..CKeyLength-1] of byte;
procedure RockstarDecrypt(Data: Pointer; Size: cardinal);
implementation
uses AesLib;
procedure RockstarDecrypt(Data: Pointer; Size: cardinal);
const
CAesRounds = 16; // because it's 16x more secure!!1!
CAesKey: array[0..CKeyLength-1] of byte = (
$1A, $B5, ... // put the full key here or load it from the exe
);
var
AesCtx: TAesContext;
i, j: Cardinal;
p: Pointer;
begin
aes_set_decrypt_key(@CAesKey[0], CKeyLength, AesCtx);
for i := 0 to Size div 16 - 1 do begin
Cardinal(p) := Cardinal(Data) + i*16;
for j := 1 to CAesRounds do
aes_decrypt_block(p^, p^, AesCtx);
end;
end;
end.
- HUGE thanks!)))
The "old" CRC32 algorithm from the GXT article
code snippet
class Checksum
{
private:
unsigned int m_aiCalcTable[265] =
{
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
};
public:
static void generateChecksumFromString(std::string source, bool caseSensitive, unsigned int &checksum)
{
checksum = 0xFFFFFFFF;
if(!caseSensitive)
{
toUpperCase(source);
}
for(unsigned int i = 0; i < source.size(); i++)
{
checksum = m_aiCalcTable[(checksum ^ source[i]) & 0xFF] ^ ((checksum >> 8) & 0x00FFFFFF);
}
}
};
PS3 version key
It seems that PS3 version of GTA4 is using same key. Found inside of EBOOT.BIN after decrypting it. JoKiv 13:00, 2 June 2011 (UTC)
- All GTA IV (and Episodes too) games on all platforms uses the same key. GooD-NTS
One at a time hash implementation
The one on the page converts everything to lowercase while the official one does not, is that a GTA-specific version? And "hashchr" isn't defined anywhere in that code.