FIFA 15 Hashing Algorithm


Senior Squad
I'm trying to get a hold of FIFA's hashing algorithm for 15. I have come across a few resources and am still working on implementing them. Namely:

But these are older and I am having a hard time discerning whether these algorithm's are still accurate.

I know Rinaldo has this solved but he's been MIA for about 9 months.

If anyone knows anyone who might know someone who knows this answer, it'd be greatly appreciated if you would be willing to pass that information along. Meanwhile, I will keep at it.

I thought at one point Rinaldo said he shared his source code with us. But, I haven't been able to find mention of this anywhere and I certainly cannot find the code.



Senior Squad
I implemented the Rob McGee algorithm and the algorithm isn't correct.

Surely someone has to know the answer to this... Tons of programs do this. If you can just give me a hint about where I need to look for this or which part of the MD5 code (if that's their base) they modified. Not asking for much from the experienced programmers here. Will donate for a little help.


Senior Squad
And this:

Dim Reader As New BinaryReader(New FileStream("C:\MyTestData.bin", FileMode.Open)) 'Declare a new reader
Dim Count As UInt32 = (Reader.BaseStream.Length / &H800) 'How many chunks to loop through
Dim LeftOver As UInt32 = (Reader.BaseStream.Length Mod &H800) 'The amount of bytes left over that were not large enough for a chunk
Dim Block(&H800 - 1) As Byte 'Temporary array for storing data to pass to algorithm
'Declare a new instance of the EA checksum to compute with. Optionally you can pass your own custom CRC table. If not the default "universal" table will be used
Dim CRC As New EAChecksum()
For i As Int32 = 0 To Count - 1
Reader.BaseStream.Position = (i * &H800) 'Set reader position
Array.Copy(Reader.ReadBytes(&H800), Block, &H800) 'Copy chunk of data into temporary array
CRC.TransformBlock(Block, 1024) 'Pass a chunk of data to add into the generation of the hash
Array.Clear(Block, 0, Block.Length) 'Clear old data
If Not LeftOver = 0 Then 'If there's bytes left over, compute the last chunk of data
ReDim Block(LeftOver - 1) 'Resize the array
Array.Copy(Reader.ReadBytes(LeftOver), Block, LeftOver) 'Copy chunk of data into temporary array
CRC.TransformFinalBlock(Block, LeftOver) 'Pass the last chunk of data through the algorithm. This will also return the hash value if you decide not to use the GetHash method
End If
Dim MyHashUInteger As UInt32 = CRC.GetHash 'Get hash value in UInt32 form
Dim MyHashBytes As Byte() = CRC.GetHashBytes 'Get hash value in byte array form
CRC.Dispose() 'Dispose of the class

'Using the Reset() call will reset all cached data and the working CRC table so re-declaring the class isn’t necessary. Optionally you can pass your own custom table in this method as well

'The CurrentTable() property allows you to get or set the current working CRC table


Senior Squad
regularcat;3853701 said:
Why don't you PM Iard86 or Fifacittiu.

Tried both as well as about 6 others. No responses. Hopeful they still will. Certainly not trying to bug anyone. But, the people who know this shit are understandably very busy. So it's hard to get their attention long enough to learn what you need to to move the ball forward.

Basically I'm desperate and hopeful and understanding all at once (I hope?)

EDIT--I'm sure other people think the same thing about us. It's generally tough to reach down below you and explain the same stuff over and over when you haven't had to learn it in years. Just feels like there are better things to do. Also, I literally JUST tried FIFACITTIU. If he's on another continent, he's been asleep since I sent the pm.


Senior Squad

It appears that most programs created by users for FIFA are just using Rinaldo's fifa library. How he generated the language hashes in the first place, I don't know. His library is written in c# and is available with most of his tools.

I am almost certain that the function needed for the hash id is available in FifaLibrary.FI.language_hashid.

I'm still too much of a novice to figure out how to actually call this function effectively or pass it variables. But, I'm still working on it.

Currently I'm getting this error:

Error 1 Non-invocable member 'FifaLibrary.FI.language_hashid' cannot be used like a method.

Which I think basically means that I'm not invoking it properly. I'll keep working on this and share what I figure out.

Big thank you to scouser09 for helping me get this far with it.

EDIT-- Actually it might make more sense that this function just loads the hashID's that are already stored rather than actually calculating new ones. Back to the drawing board.


Senior Squad
Another update:

I forced DBM to throw an exception (was harder to do that I expected. Rinaldo is a good coder)... I studied that to determine which function it was calling from his library.

It looks like I was assuming it was only calculating the hash for a specific value (the most recent one I added). He has it calculating the hash on every value every time in a function called CalculateAllHash();

Something was also calling the FIFAControls.dll library as well. I'm not sure what. But, I will study these and share what I figure out.

There are those out there that know the answer to this... I sure would love their help...


Senior Squad
This is solved by Scouser and FIFAccitiu using Rinaldo's library! Also thanks to Malloc for providing some insights as well. The script below will demonstrate how to do it. Tweak the script to fit your needs. It's in C# (and you probably don't need all of the library's I am including.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using FifaLibrary;
using Microsoft.Win32;

namespace WindowsFormsApplication2
    public partial class Form1 : Form
        public Form1()

        private void button1_Click(object sender, EventArgs e)
            List<string> listToHash = new List<string>();
            string[] arrayToHash = listToHash.ToArray();

        private static void calcHash(string[] args)
            Console.WriteLine(args[0]+" hashes to: ");
//This is the crucial line that will actually complete the hashing.            Console.WriteLine(unchecked((int)FifaUtil.ComputeLanguageHash(args[1])));


I confirmed this against DBM15 which, as always, is perfectly accurate.

Thanks for everyone's help, especially Scouser who was the one to send me the code.