Зашифровать файл в C # и расшифровать во флаттере - PullRequest
0 голосов
/ 03 ноября 2019

Я зашифровал файл в коде c #, используя RijndaelManaged, который доступен в System.Security.Cryptography. Этот файл должен быть передан в мобильное приложение, разработанное с использованием дартс / флаттер, и мне нужно его расшифровать с помощью кода дартс и представить его пользователю. Как это можно сделать?

Ниже показан код для шифрования в c #:

            string password = keyPhrase; // Your Key Here
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] key = UE.GetBytes(password);

            string cryptFile = outputFile;
            FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);

            RijndaelManaged RMCrypto = new RijndaelManaged();

            CryptoStream cs = new CryptoStream(fsCrypt,
                RMCrypto.CreateEncryptor(key, key),
                CryptoStreamMode.Write);

            FileStream fsIn = new FileStream(inputFile, FileMode.Open);

            int data;
            while ((data = fsIn.ReadByte()) != -1)
                cs.WriteByte((byte)data);


            fsIn.Close();
            cs.Close();
            fsCrypt.Close();

Спасибо

1 Ответ

1 голос
/ 05 ноября 2019

Режим по умолчанию Rijndael в .Net имеет размер блока 128 бит - совместимый с AES. Если вы не используете нестандартный размер блока, предпочтите .Net * AesManaged.

. Вы не указали, какой отступ или режим вы используете. По умолчанию .Net, похоже, CBC, поэтому мы предположим, что. Не ясно, по умолчанию ли это определенный режим заполнения.

(Обратите внимание, что вы используете ключ и в качестве IV, и в качестве ключа. IV должен быть уникальным для каждого вызова процедуры шифрования. TLDR -то, как вы используете AesManaged, небезопасно - не используйте этот код в реальной жизни.)

Кроме того, вы декодируете ключ из строки. Длина ключа AES должна составлять ровно 128 или 256 бит (или один из наиболее необычных). Если вы правильно не выбрали свою строку, вряд ли UTF-8 закодирует точную длину ключа. Кроме того, используя строку, вы используете только байты в ключе, которые оказались символами. Как правило, чтобы использовать строку в качестве пароля, вы должны преобразовать ее в ключ с использованием алгоритма деривации ключа (например, PBKDF2), а не просто в кодировке UTF-8.

С учетом всего сказанного, если ваш пароль точно16 (или длиной 32), и ваш файл является кратным 16 байтам (если это не так, вам нужно решить, как его заполнить), вы сможете расшифровать его так:

import 'dart:convert';
import 'dart:io';

import 'package:pointycastle/export.dart';

main() async {
  var key = utf8.encode('abcdefghijklmnop');

  var cipher = CBCBlockCipher(AESFastEngine())
    ..init(false, ParametersWithIV<KeyParameter>(KeyParameter(key), key));

  var cipherText = await File('encryptedFile').readAsBytes();
  var plainText = cipher.process(cipherText);

  await File('decryptedFile').writeAsBytes(plainText, flush: true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...