3

私はここ数日、ウィザーズオブザコーストキャラクタービルダーAPI(アプリがユーザーのキャラクターをサーバーから直接ダウンロードできるようにするため)にログインするために使用される単純な暗号化(ここにあります)を何かに移植しようと取り組んできました。 AesManagedがMetro暗号化ライブラリに組み込まれなかったため、Windows8Metroアプリで使用できます。私はせいぜい初心者プログラマーなので、これは私のスキルを少し超えていることが証明されています。

移植する必要のあるコードは次のとおりです。

public static byte[] SimpleEncrypt(string value, string key)
{
    byte[] buffer2;
    ICryptoTransform transform = GetSimpleAlgorithm(key).CreateEncryptor();
    using (MemoryStream stream = new MemoryStream())
    {
        using (CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write))
        {
            byte[] bytes = Encoding.UTF8.GetBytes(value);
            stream2.Write(bytes, 0, bytes.Length);
            stream2.Flush();
            stream2.FlushFinalBlock();
            stream.Position = 0L;
            buffer2 = stream.ToArray();
        }
    }
    return buffer2;
}

private static SymmetricAlgorithm GetSimpleAlgorithm(string key)
{
    AesManaged aes = new AesManaged();
    byte[] source = new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes(key));
    return new AesManaged { Key = source, IV = source.Take<byte>((aes.BlockSize / 8)).ToArray<byte>() };
}

これは、ログインを渡す前にパスワードを暗号化するために使用されます。

contentClient.Login(username, SimpleEncrypt(password, username));

また、必要な場合は、Webサービスは次の場所にあります。http://ioun.wizards.com/ContentVault.svc

最初のリンクの上のリンクに関するコメントで、誰かが2月にWindows 8のコードを提案しましたが、コードにはコンパイルする前に修正しなければならない問題がいくつかあり、それでも、それを使ってログインすると、「パディングが無効で削除できない」という例外がサービスから返されます。

これが私が現在取り組んでいるものです:

private static byte[] SimpleEncrypt(string value, string key)
{
    var simpleAlgorithm = GetSimpleAlgorithm(key);
    var encryptedBuffer = CryptographicEngine.Encrypt(simpleAlgorithm.Item1, CryptographicBuffer.ConvertStringToBinary(value, BinaryStringEncoding.Utf8), simpleAlgorithm.Item2);
    var result = new byte[encryptedBuffer.Length];
    CryptographicBuffer.CopyToByteArray(encryptedBuffer, out result);
    return result;
}

private static Tuple<CryptographicKey, IBuffer> GetSimpleAlgorithm(string key)
{
    var provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
    var keyAsBinary = CryptographicBuffer.ConvertStringToBinary(key, BinaryStringEncoding.Utf8);
    var source = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha256).HashData(keyAsBinary);
    var shortKey = CryptographicBuffer.CreateFromByteArray(UTF8Encoding.UTF8.GetBytes(key).Take((int)provider.BlockLength).ToArray());

    return new Tuple<CryptographicKey,IBuffer>(provider.CreateSymmetricKey(source), shortKey);
}

これを機能させるための助けをいただければ幸いです。

4

1 に答える 1

1

ウェルプは、それを調べることにもっと時間を費やし、問題を理解しました。

提案された更新バージョンは、「キー」文字列を使用してIVを作成していましたが、代わりにキーのハッシュを使用する必要がありました。

誰かがそれを望む場合に備えて、これが機能バージョンです:

private static byte[] SimpleEncrypt(string value, string key)
{
    var simpleAlgorithm = GetSimpleAlgorithm(key);
    CryptographicKey encryptKey = simpleAlgorithm.Item1;
    IBuffer IV = simpleAlgorithm.Item2;
    var encryptedBuffer = CryptographicEngine.Encrypt(encryptKey, CryptographicBuffer.ConvertStringToBinary(value, BinaryStringEncoding.Utf8), IV);

    var result = new byte[encryptedBuffer.Length];
    CryptographicBuffer.CopyToByteArray(encryptedBuffer, out result);
    return result;
}

private static Tuple<CryptographicKey, IBuffer> GetSimpleAlgorithm(string key)
{
    var provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
    var keyAsBinary = CryptographicBuffer.ConvertStringToBinary(key, BinaryStringEncoding.Utf8);
    var source = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha256).HashData(keyAsBinary);

    byte[] sourceArray = new byte[source.Length];
    CryptographicBuffer.CopyToByteArray(source, out sourceArray);

    var shortKey = CryptographicBuffer.CreateFromByteArray(sourceArray.Take((int)provider.BlockLength).ToArray());

    return new Tuple<CryptographicKey,IBuffer>(provider.CreateSymmetricKey(source), shortKey);
}
于 2012-11-06T12:33:13.720 に答える