Это мой класс для создания хэша CRC32. Это не мой класс, я нашел его в интернете. Но я не могу заставить работать SSL или AES, потому что у меня есть только базовые знания в области кодирования.
Я делаю лаунчер для своей маленькой игры, ничего особенного. Мне не нужно сверхсильное шифрование, мне нужно только скрывать клиентские запросы от случайных.
Где-то в Интернете люди говорили, что CRC32 — это односторонний хэш, но, очевидно, это не так.
Внутри класса есть функция для шифрования и дешифрования, оба работают очень хорошо.
Я проверил отправку хэшированных и не хэш
В будущем я планирую создать на жестком диске пользователей скрытый файл со случайным текстом, взять его контрольную сумму и использовать его в качестве ключа для генерации CRC, а также в качестве идентификатора игрового автомата. Ключ будет отправлен только при первом запуске приложения. Я знаю, что это небезопасно, но для меня этого достаточно.
// Copyright (c) Damien Guard. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// Originally published at http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace Namechanger
{
/// <summary>
/// Implements a 32-bit CRC hash algorithm compatible with Zip etc.
/// </summary>
/// <remarks>
/// Crc32 should only be used for backward compatibility with older file formats
/// and algorithms. It is not secure enough for new applications.
/// If you need to call multiple times for the same data either use the HashAlgorithm
/// interface or remember that the result of one Compute call needs to be ~ (XOR) before
/// being passed in as the seed for the next Compute call.
/// </remarks>
public class StringEncryption
{
private readonly Random random;
private readonly byte[] key;
private readonly RijndaelManaged rm;
private readonly UTF8Encoding encoder;
public object Assert { get; private set; }
public StringEncryption()
{
this.random = new Random();
this.rm = new RijndaelManaged();
this.encoder = new UTF8Encoding();
this.key = Convert.FromBase64String("cGFzc3dvcmRz");
}
public string Encrypt(string unencrypted)
{
var vector = new byte[16];
this.random.NextBytes(vector);
var cryptogram = vector.Concat(this.Encrypt(this.encoder.GetBytes(unencrypted), vector));
return Convert.ToBase64String(cryptogram.ToArray());
}
public string Decrypt(string encrypted)
{
var cryptogram = Convert.FromBase64String(encrypted);
if (cryptogram.Length < 17)
{
throw new ArgumentException("Not a valid encrypted string", "encrypted");
}
var vector = cryptogram.Take(16).ToArray();
var buffer = cryptogram.Skip(16).ToArray();
return this.encoder.GetString(this.Decrypt(buffer, vector));
}
private byte[] Encrypt(byte[] buffer, byte[] vector)
{
var encryptor = this.rm.CreateEncryptor(this.key, vector);
return this.Transform(buffer, encryptor);
}
private byte[] Decrypt(byte[] buffer, byte[] vector)
{
var decryptor = this.rm.CreateDecryptor(this.key, vector);
return this.Transform(buffer, decryptor);
}
private byte[] Transform(byte[] buffer, ICryptoTransform transform)
{
var stream = new MemoryStream();
using (var cs = new CryptoStream(stream, transform, CryptoStreamMode.Write))
{
cs.Write(buffer, 0, buffer.Length);
}
return stream.ToArray();
}
public void EncryptDecrypt()
{
// Arrange
var subject = new StringEncryption();
var originalString = "Testing123!£$";
// Act
var encryptedString1 = subject.Encrypt(originalString);
var encryptedString2 = subject.Encrypt(originalString);
var decryptedString1 = subject.Decrypt(encryptedString1);
var decryptedString2 = subject.Decrypt(encryptedString2);
}
}
Mycode, что я отправляю на php
var subject = new StringEncryption();
var originalString = "" + getCheckSumFile(assemblypath) + " " + unixTimestamp + "";
var hashed = subject.Encrypt(originalString);
var unhashed = subject.Decrypt(hashed);
string str = string.Concat("http://127.0.0.1/here/?nick=", nick, "&server=", server, "&data=", hashed);
Network.getData(str);
Пока что все работает только для меня, я не знаю, как расшифровать CRC32 с помощью ключа с помощью php? Я не нахожу никакой информации об этом вообще, большинство руководств php использует только хэш crc без намерения расшифровать его ключом.
Задача ещё не решена.
Других решений пока нет …