Еще раз мне поручено преобразовать код ColdFusion, используемый для единого входа на C#, и я быстро работаю. Этот вопрос полностью отличается от моего вопроса, на который был дан ответ here, так что я вернулся к тому, чтобы быть в моей голове.Преобразование кода шифрования Coldfusion в C# (снова)
Оригинальный код ColdFusion выполнен в теге <cfscript>. Я заменил СРК и PWD переменные с сокращенными заполнителей просто, чтобы скрыть их фактические значения:
//create a key to be used
src="xxx";
pwd="abc";
// Base64 Decoding the key
base64Decoder = createObject("java", "sun.misc.BASE64Decoder");
desKeyData = base64Decoder.decodeBuffer(pwd);
// Initialize the constructor of DESedeKeySpec with private key
KeySpec=createObject("java", "javax.crypto.spec.DESedeKeySpec");
KeySpec=KeySpec.init(desKeyData);
// Generate the secret key using SecretKeyFactory
keyFac=createObject("java", "javax.crypto.SecretKeyFactory").getInstance("DESede");
secretKey =keyFac.generateSecret(KeySpec);
// Get CIPHER OBJ ready to use
decodecipher = createObject("java", "javax.crypto.Cipher").getInstance("DESede/ECB/PKCS5Padding");
decodecipher.init(2, secretKey);
encodecipher = createObject("java", "javax.crypto.Cipher").getInstance("DESede/ECB/PKCS5Padding");
encodecipher.init(1, secretKey);
stringBytes = toString(src).getBytes("UTF8");
raw = encodecipher.doFinal(stringBytes);
// Base64Encoding of generated cipher
cipherText=ToBase64(raw);
У меня также есть документ, с другой стороны, которая обрисовывает в общих чертах шаги для создания единого входа следующим образом:
Создание зашифрованного маркера
- Создание простого текста (это соответствует переменной ЦСИ выше, и эта часть я успешно сделал в C#)
с планшетом plain text
Декодировать ключ (ключ соответствует переменной pwd выше и должен быть декодирован базой 64; Я думаю, что я успешно получил до этого момента, а также.)
Выполните шифрование (используйте расшифрованный ключ, полученный выше, и простой текст, чтобы сделать шифрование)
закодировать зашифрованный текст (URL кодируется)
Я установили библиотеки BouncyCastle и пытаются использовать те, но я застрял на этапе фактического шифрования. До сих пор начало моего C# преобразования выглядит следующим образом (в очередной раз маркер и ключ имеют сокращенные заполнители, чтобы скрыть фактические значения):
//steps omitted here to create src string
string token = "xxx";
string key = "abc";
byte[] decodedKeyBytes = Convert.FromBase64String(key);
Я знаю, что это не так много, чтобы идти дальше, но у меня пробовал так много вещей, которые не работали, что я потерял трек. В конце концов, когда я получаю к части, где я инициализации шифра, я полагаю, мне нужно что-то вроде этого:
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new DesEdeEngine());
Большое спасибо за любые предложения/примеры.
Update:
Благодаря очень полезный ответ ниже, я был в состоянии получить эту работу, используя следующий код:
string token = "xxx";
string key = "abc";
byte[] base64DecodedKeyBytes = Convert.FromBase64String(key);
byte[] inputBytesToken = System.Text.Encoding.UTF8.GetBytes(token);
// initialize for EBC mode and PKCS5/PKCS7 padding
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new DesEdeEngine());
KeyParameter param = new KeyParameter(base64DecodedKeyBytes);
cipher.Init(true, param);
// encrypt and encode as base64
byte[] encryptedBytesToken = cipher.DoFinal(inputBytesToken);
string tokenBase64 = System.Convert.ToBase64String(encryptedBytesToken);
Ах, ладно, спасибо! По крайней мере, я не был ужасно выключен с инициализацией шифрования. :) Я все еще немного не уверен в части шифрования, хотя - в коде из моего другого вопроса у меня был только статический ключ, но в этом я получил ключ и динамически генерируемый зашифрованный токен, поэтому Я не совсем уверен, как объединить оба из них на этапе шифрования. – user3562286
EDIT: * объедините оба из них на этапе шифрования. * Возможно, мой мозг устал, но я не вижу полной картины в том, что вы разместили. Исходный код CF/java - это просто базовый 'encrypt()'. Запустите код C# с классом TripleDES, и вы получите тот же результат. Могут ли они означать «использовать приведенный выше код для генерации« ключа », который будет использоваться для шифрования« Blowfish »? – Leigh
Любая удача? Казалось, вы просто пытались преобразовать код cfscript. Если нет, можете ли вы опубликовать более подробную информацию, потому что это звучит так, как будто отсутствует фрагмент головоломки. – Leigh