質問

状況にようにしているに解決できます:私のコアながらプレーする必要がありま暗号化文字列で対称暗号ではPHP、そして、そのスクリプトデコードのデータです。の工程で作業する必要のあるユーザーに逆転の返答えをサポートに対するコミットメントに符号化し、ココアをデコードす).

僕は情報を見落とさないようでも取得できますのキーの初期化ベクタ(iv)の両方のPHP、ココア、復号な作品がアプリを送信し、その符号化データました。仕事は、イブレア城、イブレア大符号化/復号独自のデータの確認だそれほど広くはありませんがあPEBKAC行います。っていう容疑であるパディング問題の起うになります。

私のココアのアプリを符号化を用いSSCryptoでハンディ-ダンディラッパOpenSSLます。の暗号はふぐ、モードがCBC.(ご容赦のメモリの漏えい、コードを裸の裸の必需品)

NSData *secretText = [@"secretTextToEncode" dataUsingEncoding:NSUTF8StringEncoding];
NSData *symmetricKey = [@"ThisIsMyKey" dataUsingEncoding:NSUTF8StringEncoding];

unsigned char *input = (unsigned char *)[secretText bytes];
unsigned char *outbuf;
int outlen, templen, inlen;
inlen = [secretText length];

unsigned char evp_key[EVP_MAX_KEY_LENGTH] = {"\0"};
int cipherMaxIVLength = EVP_MAX_IV_LENGTH;
EVP_CIPHER_CTX cCtx;
const EVP_CIPHER *cipher = EVP_bf_cbc();

cipherMaxIVLength = EVP_CIPHER_iv_length( cipher );
unsigned char iv[cipherMaxIVLength];

EVP_BytesToKey(cipher, EVP_md5(), NULL, [symmetricKey bytes], [symmetricKey length], 1, evp_key, iv);

NSData *initVector = [NSData dataWithBytes:iv length:cipherMaxIVLength];

EVP_CIPHER_CTX_init(&cCtx);

if (!EVP_EncryptInit_ex(&cCtx, cipher, NULL, evp_key, iv)) {
    EVP_CIPHER_CTX_cleanup(&cCtx);
    return nil;
}
int ctx_CipherKeyLength = EVP_CIPHER_CTX_key_length( &cCtx );
EVP_CIPHER_CTX_set_key_length(&cCtx, ctx_CipherKeyLength);

outbuf = (unsigned char *)calloc(inlen + EVP_CIPHER_CTX_block_size(&cCtx), sizeof(unsigned char));

if (!EVP_EncryptUpdate(&cCtx, outbuf, &outlen, input, inlen)){
    EVP_CIPHER_CTX_cleanup(&cCtx);
    return nil;
}
if (!EVP_EncryptFinal(&cCtx, outbuf + outlen, &templen)){
    EVP_CIPHER_CTX_cleanup(&cCtx);
    return nil;
}
outlen += templen;
EVP_CIPHER_CTX_cleanup(&cCtx);

NSData *cipherText = [NSData dataWithBytes:outbuf length:outlen];

NSString *base64String = [cipherText encodeBase64WithNewlines:NO];
NSString *iv = [initVector encodeBase64WithNewlines:NO];

base64Stringとivを掲載してPHPできるようにデコードする

<?php

import_request_variables( "p", "p_" );

if( $p_data != "" && $p_iv != "" )
{
    $encodedData = base64_decode( $p_data, true );
    $iv = base64_decode( $p_iv, true );

    $td = mcrypt_module_open( MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '' );
    $keySize = mcrypt_enc_get_key_size( $td );
    $key = substr( md5( "ThisIsMyKey" ), 0, $keySize );

    $decodedData = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $encodedData, MCRYPT_MODE_CBC, $iv );
    mcrypt_module_close( $td );

    echo "decoded: " . $decodedData;
}
?>

decodedDataは常にgibberish.

また逆に、送信符号化された出力からのPHPにココアがEVP_DecryptFinal()が失敗すると、いうなんだよねているのはNULLのパディングの問題どこかということです。を読んで再読み込み、PHP、OpenSSL docsなぶとうと疑問に思っていましたのアイデアについてです。

役に立ちましたか?

解決

行きたいという問題である方法を原暗号化キーのキー文字列が異なるのです。Phpのmd5()関数を返します十六進文字列ます。e'a476c3...'でチョッピングの鍵サイズをEVP_BytesToKey()はかなり複雑なハッシュルーチンを返す原バイト文字列になります。でも、指定されたパラメータの簡素化を原MD5ハッシュもできません教えてくれます。なかなか出回らないきっとは異なるphpのハッシュ.

変更した場合は、phpにはmd5("ThisIsMyKey",TRUE)、また原md5ハッシュ.のココアは、SSCryptoの+getMD5ForData:法を同一の文字列(文字コード問題のほ).

編集1:場合にはphpの文字列とココアのデータを印刷しては全く同じという大きさでありながらも異なる、バイトです。Phpの文字列は、六角レンチ-符号化においてeだけで構成されて文字の0-9a-f)のココアのデータはバイトがNSData helpfullyプリントアウトしたりすることで六角レンチで符号化された文字列の内容がNSLogged).まだ追加する必要があり、第二のパラメータがTRUE phpのmd5()関数の原バイト文字列になります。

編集2: OpenSSL1.1.0cのダイジェストアルゴリズム 一部の内部。旧MD5使用した、1.1.0に切り替えSHA256.きの変更ができない影響を及ぼすも EVP_BytesToKey とコマンドのように openssl enc.

他のヒント

きっかけになるかもしれないと自分の問題です。その答え:鍵を使用した長さが異なる下ココアやクリアしました。の答...

私の問い合わせを使ったふぐ/CBCである可変鍵長暗号16バイト56.予約なら、世界最大のオンのBoazのようにキーを何らかの責任を負わせ、切り替えTripleDESの暗号として使用し固定の鍵の長さの24バイトまでとなります。次に、それに気付いたので問題:鍵の返されるココア/EVP_BytesToKey()が24バイトの長さが、返された値md5()ハッシュマキーのみ16.

の解決の問題のためのPHPをキーと同じ EVP_BytesToKey なのまで出力の長さを最少なくとも(cipherKeyLength+cipherIVLength).以下のPHPい(無視載の塩または数回)

$cipher = MCRYPT_TRIPLEDES;
$cipherMode = MCRYPT_MODE_CBC;

$keySize   = mcrypt_get_key_size( $cipher, $cipherMode );
$ivSize    = mcrypt_get_iv_size( $cipher, $cipherMode );

$rawKey = "ThisIsMyKey";
$genKeyData = '';
do
{
    $genKeyData = $genKeyData.md5( $genKeyData.$rawKey, true );
} while( strlen( $genKeyData ) < ($keySize + $ivSize) );

$generatedKey = substr( $genKeyData, 0, $keySize );
$generatedIV  = substr( $genKeyData, $keySize, $ivSize );

$output = mcrypt_decrypt( $cipher, $generatedKey, $encodedData, $cipherMode, $generatedIV );

echo "output (hex)" . bin2hex($output);

ございますのでご注意思がPKCS#5パディングの最終出力に出力します。チェックのコメントこちら http://us3.php.net/manual/en/ref.mcrypt.php のための pkcs5_padpkcs5_unpad 追加および除去とパディングします。

基本的には、原md5値の場合は、できる限り少ないが、追加のキーのmd5結果-md5る文字列です。洗浄、リンス、繰り返す。その男のページをEVP_BytesToKey()を説明すのか、実際にやって示す場だからこそ実現できる塩値のために必要がある場合。この方法の再生の鍵も正しく再生の初期化ベクタ(iv)では必要ないと考えています。

その一方で、ふぐ?

EVP_BytesToKey() を返します最小の鍵で暗号化してまいコンテキストによる、キーサイズです。そのデフォルトのサイズはすべて取得するためのふぐは16バイトまでとなります。 mcrypt_get_key_size(), 一方、最大キーサイズです。そのため、以下のラインmyオリジナルコード:

$keySize = mcrypt_enc_get_key_size( $td );
$key = substr( md5( "ThisIsMyKey" ), 0, $keySize );

常に戻り、32文字のキーで$キーサイズに設定56.変化する上記のコード:

$cipher = MCRYPT_BLOWFISH;
$cipherMode = MCRYPT_MODE_CBC;

$keySize   = 16;

でふぐをデコードに正しくおかなりの遺跡を可変長の鍵となる。とともに、 EVP_BytesToKey() 破壊した時の変数鍵長暗号.を作成する必要がありますキー/iv異なる場合は可変鍵暗号.かくいいで3DESまいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top