Durum ben çözmeye çalışıyorum: Benim kakao app, ben, bir simetrik şifreleme ile bir dize şifrelemek PHP bunu POST, ve bu komut verilerin kodunu olması gerekir. Işlemi (PHP kodlar, Kakao decodes) bir cevap döndürmek için ters çalışmak gerekiyor.
Bir uygulama diğer kodlu verileri gönderdiğinde ben anahtar ve başlatma vektörü (iv) PHP ve kakao hem de aynı olması hem de alabilirsiniz olsa bile, kod çözme çalışır asla çünkü ben bir şey eksik. Hem iş sadece para cezası kodlama / (emin bazı PEBKAC eldeki konu yoktu yapmak doğrulanmadı) kendi veri çözme. Ben bir padding sorunu yerde orada bir şüphe var, ben sadece bunu görmüyorum.
Benim kakao app SSCrypto (OpenSSL fonksiyonlarının etrafında sadece kullanışlı-züppe sarıcı olan) kullanarak kodlar. Şifre Blowfish, modu CBC olduğunu. (Bellek sızıntılarını affet, kod çıplak şartları için elimden olmuştur)
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 ve iv sonra çözmeye çalışır PHP nakledilir:
<?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 hep anlamsız olduğunu.
Ben Kakao PHP kodlanmış çıkışı gönderme süreci tersine denedim ama EVP_DecryptFinal () NULL padding sorunu yerde var inanmak için bana yol ne olduğu, başarısız olur. Ben okumak ve yeniden okuyun PHP ve OpenSSL docs ama şimdi hepsi bir arada bulanıklık ve ben denemek için fikir bitti ettik.