Timir Patel Ответов: 2

Взаимодействия АЭС в algorithem .Чистая , андроид, Ява и iOS


Необходимость внедрения AES alogorithem в c#.net, android и ios. i.e encryotion от android и decryptiopn в .net c#

2 Ответов

Рейтинг:
4

Timir Patel

в сетях:
------------------------------------
использование системы;
использование системы.Коллекции.Общий;
использование системы.ИО;
использование системы.Безопасность.Криптография;
использование System.Text;

слой пространства имен
{

шифрование открытого класса
{

публичная статическая строка EncryptString(string plainSourceStringToEncrypt, string passPhrase)
{
//Настройка объектов шифрования
использование (AesCryptoServiceProvider acsp = GetProvider(Encoding.По умолчанию.GetBytes(парольная фраза)))
{
byte[] sourceBytes = кодировка.ASCII.Метод getbytes(plainSourceStringToEncrypt);
ICryptoTransform ictE = acsp.CreateEncryptor();

//Настройка потока для хранения шифрования
MemoryStream msS = Новый Поток памяти();

//Выполните инкрипцию, сохраняя выходные данные в потоке
CryptoStream csS = новый CryptoStream(msS, ictE, CryptoStreamMode.Писать);
csS.Write(sourceBytes, 0, sourceBytes.Длина);

экране.FlushFinalBlock();

//sourceBytes теперь шифруются как массив защищенных байтов
byte[] encryptedBytes = msS.Метод toArray(); //.ToArray() очень важен, не связывайтесь с буфером

//возвращает зашифрованные байты в виде строки в кодировке BASE64
вернуть обменять.ToBase64String(encryptedBytes);
}
}


публичная статическая строка DecryptString(string base64StringToDecrypt, string passphrase)
{
//Настройка объектов шифрования
использование (AesCryptoServiceProvider acsp = GetProvider(Encoding.По умолчанию.GetBytes(парольная фраза)))
{
byte[] RawBytes = Convert.FromBase64String(base64StringToDecrypt);
ICryptoTransform ictD = acsp.CreateDecryptor();

//Расшифровать в поток
MemoryStream msD = новый MemoryStream(RawBytes, 0, RawBytes.Длина);

CryptoStream csD = новый CryptoStream(msD, ictD, CryptoStreamMode.Read);
//csD теперь содержит исходный байтовый массив, полностью расшифрованный


//возвращает содержимое msD в виде обычной строки
return (new StreamReader(csD)).ReadToEnd();

}
}


частный статический ключ AesCryptoServiceProvider GetProvider(byte[] )
{
Результат AesCryptoServiceProvider = новый AesCryptoServiceProvider();
результат.Размер блока = 128;
результат.Размер ключа = 128;
результат.Mode = CipherMode.CBC;
результат.Обивка = PaddingMode.Pkcs7 в;

результат.IV = новый байт[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
результат.Ключ = ключ;
возвращаемый результат;
}


private static byte[] GetKey(byte[] suggestedKey, SymmetricAlgorithm p)
{
byte[] kRaw = suggestedKey;
List<byte> kList = новый список<byte>();

for (int i = 0; i < p.LegalKeySizes[0].MinSize; i += 8)
{
kList.Add(kRaw[(i / 8) % kRaw.Длина]);
}
байт[] к = для.Метод toArray();
вернуться к;
}
}
}

==============

в Xcode:
----------

#импорт "StringEncryption.h"
#импорт "NSData+Base64.h"

#если отладка
#define LOGGING_FACILITY(X, Y) \
NSAssert(X, Y);

#define LOGGING_FACILITY1(X, Y, Z) \
NSAssert1(X, Y, Z);
#еще
#define LOGGING_FACILITY(X, Y) \
если(!(X)) { \
NSLog(Y); \
выход(-1); \
}

#define LOGGING_FACILITY1(X, Y, Z) \
если(!(X)) { \
NSLog(Y, Z); \
выход(-1); \
}
#endif

@реализация StringEncryption

NSString *_key = @"ключ";
CCOptions padding = kCCOptionPKCS7Padding;



+ (NSString *) EncryptString:(NSString *)plainSourceStringToEncrypt
{

StringEncryption *crypto = [[StringEncryption alloc] init];

NSData *_secretData = [plainSourceStringToEncrypt dataUsingEncoding:NSASCIIStringEncoding];

NSData *encryptedData = [crypto encrypt:_secretData key:[_key dataUsingEncoding:NSUTF8StringEncoding] padding:&padding];

return [encryptedData base64EncodingWithLineLength:0];

}


+ (NSString *)DecryptString:(NSString *)base64StringToDecrypt
{
StringEncryption *crypto = [[StringEncryption alloc] init];
Формат NSData *данные = [крипто расшифровки:[NSData для dataWithBase64EncodedString:base64StringToDecrypt] ключ:[_key dataUsingEncoding:NSUTF8StringEncoding] обивка: &ампер;прокладка];
return [[NSString alloc] initWithData:кодирование данных:NSUTF8StringEncoding];

}


- (Формат NSData *)шифрование:(формат NSData *)ключ открытый текст:(формат NSData *)aSymmetricKey обивка:(CCOptions *)pkcs7 в
{
return [self doCipher:plainText key:aSymmetricKey context:kCCEncrypt padding:pkcs7];
}

- (Формат NSData *)расшифровать:(формат NSData *)ключ открытый текст:(формат NSData *)aSymmetricKey обивка:(CCOptions *)pkcs7 в
{
return [self doCipher:plainText key:aSymmetricKey context:kCCDecrypt padding:pkcs7];
}

- (Формат NSData *)doCipher:(формат NSData *)ключ открытый текст:(формат NSData *)aSymmetricKey
контекст:(CCOperation)encryptOrDecrypt padding:(CCOptions *)pkcs7
{

// Симметричная криптографическая ссылка.
CCCryptorRef thisEncipher = NULL;
// Контейнер зашифрованного текста.
NSData * cipherOrPlainText = nil;
// Указатель на выходной буфер.
uint8_t * bufferPtr = NULL;
// Общий размер буфера.
size_t bufferPtrSize = 0;
// Оставшиеся байты для выполнения.
size_t remainingBytes = 0;
// Количество байтов, перемещенных в буфер.
size_t movedBytes = 0;
// Длина буфера открытого текста.
size_t plainTextBufferSize = 0;
// Заполнитель для всего написанного.
size_t totalBytesWritten = 0;
// Дружественный вспомогательный указатель.
uint8_t * PTR записи;

// Вектор инициализации; фиктивный в данном случае 0's.
uint8_t iv[kChosenCipherBlockSize];
memset((void *) iv, 0x0, (size_t) sizeof(iv));

plainTextBufferSize = [длина открытого текста];



// Мы не хотим бросать обивку, если нам это не нужно
if(encryptOrDecrypt == kCCEncrypt) {
/*
если(*pkcs7 != kCCOptionECBMode) {
if((plainTextBufferSize % kChosenCipherBlockSize) == 0) {
*pkcs7 = 0x0000;
} еще {
*pkcs7 = kCCOptionPKCS7Padding;
}
}*/
} else if(encryptOrDecrypt != kCCDecrypt) {

}

// Создайте и инициализируйте криптографическую ссылку.
CCCryptorStatus ccStatus = kCCSuccess;


ccStatus = CCCryptorCreate(encryptOrDecrypt,
kCCAlgorithmAES128,
*pkcs7,
(const void *)[асимметричные байты],
kChosenCipherKeySize,
(const void *)iv,
&ампер;thisEncipher
);


// Вычислить выравнивание байтовых блоков для всех вызовов до и включая final.
bufferPtrSize = CCCryptorGetOutputLength(thisEncipher, plainTextBufferSize, true);

// Выделить буфер.
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t) );

// Обнуление буфера.
memset((void *)bufferPtr, 0x0, bufferPtrSize);

// Инициализируйте некоторые необходимые бухгалтерские операции.

ptr = bufferPtr;

// Настройка начального размера.
remainingBytes = bufferPtrSize;

// Фактически выполните шифрование или дешифрование.

ccStatus = CCCryptorUpdate(thisEncipher,
(const void *) [байты открытого текста],
plainTextBufferSize,
запись ptr,
remainingBytes,
&movedBytes
);


// Ведение бухгалтерского учета.
для PTR += movedBytes;
remainingBytes -= movedBytes;
totalbyteswrited += movedBytes;


ccStatus = CCCryptorFinal(этот шифр,
запись ptr,
remainingBytes,
&movedBytes
);

totalbyteswrited += movedBytes;

если(этот шифр) {
(void) CCCryptorRelease(thisEncipher);
thisEncipher = NULL;
}



if (ccStatus == kCCSuccess)
cipherOrPlainText = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)totalbyteswrited];
еще
cipherOrPlainText = nil;

if(bufferPtr) free(bufferPtr);

возврат зашифрованного текста;

}




@конец
------------
#импортировать

static char encodingTable[64] = {
'А','Б','С','Д','Е','Е','Г','Ч','Я','Ж','К','Л','М','Н','О','П',
'Г','р','О','Т','У','В','З','х','у','З','А','Б','С','Д','Е','Ф',
'г','ч','я','ж','К','Л','М','н','о',


Richard MacCutchan

Пожалуйста, не сбрасывайте неформатированный код подобным образом.

Member 13963008

Я реализовал .для .net и java, мне нужно реализовать то же самое в android. Не могли бы вы предоставить решение для android? Заранее благодарю.

Рейтинг:
19

Sergey Alexandrovich Kryukov

В этом вопросе нет никакого смысла. Алгоритм один и тот же во всех случаях. Это реализация может быть разной, в зависимости от языка. Пожалуйста смотрите:
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard[^],
http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf[^].

Кроме того, в принципе, вы можете использовать Mono на всех этих платформах и использовать C# и т. д.Net-сборки System.Security.Cryptography, или Java, используя класс Java javax.crypto.Cipher, а также на всех этих платформах. Пожалуйста смотрите:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes%28v=vs.110%29.aspx[^],
http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html[^].

—СА