2015-02-03 2 views
2

Еще раз мне поручено преобразовать код 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); 

ответ

0

Это один полностью отличается

Не так много ;-) Вы уже ответили на свой вопрос.

Не позволяйте java-коду бросать вас. Игнорируя некоторые неиспользуемые переменные, он делает то же самое, что и encrypt() на другой теме - кроме как с «TripleDES» вместо «Blowfish». encrypt() скрывает много сложности, но внутренне он делает то же самое - используя те же самые классы Java FWIW. Это означает, что вы можете использовать один и тот же код на C#.Как вы уже догадались, вам просто нужно поменять крипто двигатель:

.... 
// initialize for EBC mode and PKCS5/PKCS7 padding 
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new DesEdeEngine()); 
... 

Update:

Просто разработать немного, когда вы используете encrypt(someUTF8String, base64Key, algorithm, encoding), CF выполняет те же действия, как ваш код Java внутренне:

  1. декодирует ключ из base64, и создает объект KeySpec для данного алгоритма, т.е.

    // Base64 Decoding the key // CF may use a different decoder, but the overall process is the same base64Decoder = createObject("java", "sun.misc.BASE64Decoder"); .... secretKey =keyFac.generateSecret(KeySpec);

  2. Далее он извлекает UTF-8 байт обычного текста, т.е.

    stringBytes = toString(src).getBytes("UTF8");

  3. CF затем создает шифр, который подушечка и шифрует простой текст, то есть:

    encodeCipher = createObject("java", "javax.crypto.Cipher").getInstance(algorithm); encodeCipher.init(1, secretKey); // 1 - ENCRYPT_MODE raw = encodeCipher.doFinal(stringBytes);

  4. Наконец, CF кодирует зашифрованные байты как base64, то есть:

    cipherText=ToBase64(raw);

Так как вы можете видеть, код Java и encrypt делать то же самое.

+0

Ах, ладно, спасибо! По крайней мере, я не был ужасно выключен с инициализацией шифрования. :) Я все еще немного не уверен в части шифрования, хотя - в коде из моего другого вопроса у меня был только статический ключ, но в этом я получил ключ и динамически генерируемый зашифрованный токен, поэтому Я не совсем уверен, как объединить оба из них на этапе шифрования. – user3562286

+0

EDIT: * объедините оба из них на этапе шифрования. * Возможно, мой мозг устал, но я не вижу полной картины в том, что вы разместили. Исходный код CF/java - это просто базовый 'encrypt()'. Запустите код C# с классом TripleDES, и вы получите тот же результат. Могут ли они означать «использовать приведенный выше код для генерации« ключа », который будет использоваться для шифрования« Blowfish »? – Leigh

+0

Любая удача? Казалось, вы просто пытались преобразовать код cfscript. Если нет, можете ли вы опубликовать более подробную информацию, потому что это звучит так, как будто отсутствует фрагмент головоломки. – Leigh

Смежные вопросы