Game Development Reference

In-Depth Information

Crc32 crc = new Crc32();

byte[] result = crc.Calculate(stream);

}

Using the data “This is a test” will result in a 32-bit checksum value of 2042881507.

The result will be a 32-bit (4-octet) checksum of the data that was provided to the

CRC-32 algorithm, and will subsequently be compared against a future checksum

calculation.

Alternative

There is one potential problem with the CRC-32 Checksum algorithm in regards

to malicious security attacks. Generally, these issues are not important for verifi-

cation of simple data integrity, but it may be advisable to seek an alternative algo-

rithm in environments where security is a concern; verifying the integrity of pack-

ets in a multiplayer environment, for example.

The problem with the CRC-32 (Cyclic Redundancy Checksum) algorithm is that

it is not
collision-proof,
meaning that it is possible to generate two checksum val-

ues that are identical. This is not an extremely common occurrence, but it intro-

duces enough exploitability that a malicious plain-text attack could be used to

spoof an integrity check. The probability that two different blocks of data will have

the same checksum value in an N-bit checksum is 1/2
N
. The larger the value rep-

resented by N, the lower the probability that two different blocks of data will have

the same checksum value. So the probability that our CRC-32 implementation will

generate an identical checksum for two different blocks of data is 1/2
32
,a percent-

age that is reasonable enough for most situations.

As an alternative, you can utilize the built-in MD5 algorithm from the

System.Security.Cryptography
namespace. This algorithm is known so far to be

collision-proof, and may be used in place of CRC-32 for better security and cred-

ibility with a bit of increased overhead.

Implementing the built-in functionality from Microsoft is very easy. Reference the

System.Security.Cryptography
namespace and use the following code:

byte[] data = new byte[DATA_SIZE];

MD5 md5 = new MD5CryptoServiceProvider();

byte[] result = md5.ComputeHash(data);