Недавно я пишу сервер сообщений Java, и мне также нужно создать версию клиента .NET. Им необходимо безопасно взаимодействовать, основываясь на некоторых простых криптографических протоколах, используя шифрование с открытым ключом, симметричное шифрование и алгоритмы хеширования. В ходе этого процесса я приобрел определенное представление о компонентах шифрования этих двух платформ. Вот некоторые из моих новых представлений.
1. Симметричное шифрование
1) Симметричное шифрование в Java 1.5 очень простое и предоставляет больше алгоритмов. Можно сказать, что он прост в использовании, надежен и полностью функционален.
Например:
SecretKeySpec skeySpec = новый SecretKeySpec(ключ, шифр "AES"
= Cipher.getInstance("AES")
;
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decryptText = cipher.doFinal(данные);
2) Для симметричного шифрования .NET 2.0 режимом шифрования по умолчанию является CBC. При шифровании CBC требуются ключ и вектор инициализации, что делает его неудобным для использования новичками. Это очень серьезная проблема. справиться, просто измените конфигурацию.
Алгоритм СимметричногоАлгоритма = СимметричныйАлгоритм.Создать(имяалгоритма);
алгоритм.Режим = CipherMode.ECB;
алгоритм.Ключ = ключ;
алгоритм.Padding = PaddingMode.PKCS7 После этой настройки вы можете взаимодействовать с Java, а также шифровать и расшифровывать друг друга.
3) В рамках .NET 2.0 и Java 1.5 названия алгоритмов шифрования местами немного отличаются.
AES <==> Рейндал
DESede <==> TripleDES
Кажется, это здравый смысл.
2. Алгоритм шифрования с открытым ключом RSA.
1) В Java 1.5 массив байтов, полученный путем выполнения getEncoded() для RSAPublicKey, закодирован ASN.1. Чтобы отменить его, вам необходимо использовать X509EncodedKeySpec. Вам необходимо прочитать детали документа или иметь определенное представление о криптографии, чтобы знать эту деталь. Например:
//открытый ключ ==> байт
Публичный ключ publicKey =
byte[] rawPublicKey = publicKey.getEncoded();
// байты ==> открытый ключ
X509EncodedKeySpec x509KeySpec = новый X509EncodedKeySpec (rawPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Ключ newPublicKey = keyFactory.generatePublic(x509KeySpec);
Кроме того, часть Java, предназначенная для шифрования с открытым ключом, довольно проста в использовании. Этот стиль по-прежнему прост по функциям, надежен в использовании и полностью функционален.
В Java поддерживается кодировка ASN.1, но она скрыта и совершенно невидима для пользователей.
2) В .NET 2.0 дизайн немного запутан и не поддерживает кодировку ASN.1. Но Mono, похоже, поддерживает кодировку ASN.1. По этой причине я позаимствовал реализацию Java Kaiyuan JCE и реализовал .NET-версию ASN Parser и ASN Builder, что заняло два дня. следующее:
общедоступные статические параметры RSAParameters ASN1ToPublicKey(byte[] rawPublicKey)
{
ASN1InputStream asnInput = новый ASN1InputStream (rawPublicKey);
ASN1Sequence asnSeq = (ASN1Sequence)asnInput.ReadObject();
subjectPublicKeyInfo subjectPublicKeyInfo = новый subjectPublicKeyInfo (asnSeq);
DERObjectIdentifier algOid = subjectPublicKeyInfo.AlgorithmId.ObjectId;
RSAPublicKeyStructure pubKey = новый RSAPublicKeyStructure (
(ASN1Sequence)subjectPublicKeyInfo.PublicKey
byte[] modulus = pubKey.Modulus);
байт [] publicExComponent = pubKey.PublicExComponent
RSAParameters pram = новые RSAParameters();
детская коляска.Модуль = модуль;
pram.ExComponent = publicExComponent
RSACryptoServiceProvider rsa = новый RSACryptoServiceProvider ();
rsa.ImportParameters(коляска);
вернуть коляску;
}
public static byte[] PublicKeyToASN1 (коляска RSAParameters)
{
Информация о subjectPublicKeyInfo = новая subjectPublicKeyInfo(
новый AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption,
новый DERNull()), новый RSAPublicKeyStructure(pram.Modulus, pram.ExComponent).DERObject
byte[] rawPublicKey = info.GetDEREncoded();
вернуть rawPublicKey;
}
3. Общее ощущение
1) Модуль безопасности Java хорошо спроектирован, прост и удобен в использовании и имеет полный набор функций.
2) .NET 2.0 немного беспорядочен, стиль именования и структура системы несколько противоречивы, функции отсутствуют, а организация кода не идеальна.
3) В Mono поддержка безопасности лучше, чем у Microsoft. Из Интернета можно увидеть, что некоторые функции .NET Framework 2.0 также заимствованы из Mono.
4) Можно даже считать, что команда разработчиков модуля шифрования .NET может оказаться не очень способной. Как говорится: «Писать плохой код – не наше».
http://www.cnblogs.com/jobs/archive/2006/09/22/512297.html