-1
요청을 인코딩하고 해독하기 위해 CryptoJSAES 라이브러리를 사용하는 웹 사이트가 있습니다. https://github.com/blocktrail/cryptojs-aes-php/blob/master/src/CryptoJSAES.phpAES 암호화. PHP와 Kotlin Java의 차이점
abstract class CryptoJSAES {
/**
* @param $data
* @param $passphrase
* @param null $salt ONLY FOR TESTING
* @return string encrypted data in base64 OpenSSL format
*/
public static function encrypt($data, $passphrase, $salt = null) {
$salt = $salt ?: openssl_random_pseudo_bytes(8);
list($key, $iv) = self::evpkdf($passphrase, $salt);
$ct = openssl_encrypt($data, 'aes-256-cbc', $key, true, $iv);
return self::encode($ct, $salt);
}
public static function evpkdf($passphrase, $salt) {
$salted = '';
$dx = '';
while (strlen($salted) < 48) {
$dx = md5($dx . $passphrase . $salt, true);
$salted .= $dx;
}
$key = substr($salted, 0, 32);
$iv = substr($salted, 32, 16);
return [$key, $iv];
}
public static function encode($ct, $salt) {
return base64_encode("Salted__" . $salt . $ct);
}
}
는 지금은 사이트에 대한 안드로이드 클라이언트를 통해 작업 그리고 난 붙어있어. Kotlin에서 CryptoJSAES 동작을 구현하려고하는데 작동하지 않습니다. 내가) PHP와 코 틀린 \ 자바
방법내 변형 함수 MD5()와 openssl_encrypt (사이 정확하게 차이를 이해하지 않기 때문에 그런 것 같아요 : 사용
class CryptoJSAES
{
fun encrypt(data: ByteArray, key: ByteArray, ivs: ByteArray): ByteArray?
{
try {
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
val secretKeySpec = SecretKeySpec(key, "AES")
val finalIvs = ByteArray(16)
val len = if (ivs.size > 16) 16 else ivs.size
System.arraycopy(ivs, 0, finalIvs, 0, len)
val ivps = IvParameterSpec(finalIvs)
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivps)
return cipher.doFinal(data)
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
fun evpkdf(passphrase : String, salt : String = "") : Pair<String, String>{
var salted = ""
var dx = ""
while (salted.length < 48) {
dx = MD5Encode(dx + passphrase + salt)!!
salted += dx
}
val key = salted.toString().substring(0, 32)
val iv = salted.toString().substring(32, 32 + 16)
return Pair(key, iv)
}
private fun MD5Encode(sourceString: String): String? {
try {
val bytesOfMessage = sourceString.toByteArray(charset("UTF-8"))
val md = MessageDigest.getInstance("MD5")
// byte array of md5 hash
val md5 = md.digest(bytesOfMessage)
// we convert bytes to hex as php's md5() would do
val stringBuffer = StringBuffer()
for (i in md5.indices) {
stringBuffer.append(Integer.toString((md5[i] and 0xff.toByte()) + 0x100,
16).substring(1))
}
return stringBuffer.toString()
} catch (e: Exception) {
}
return null
}
}
을 :
val testText = "Hello"
val password = "password#123456"
val salt = "12345678"
val res = evpkdf(password, salt)
val encryptTextBytes = encrypt(testText.toByteArray(), res.first.toByteArray(), res.second.toByteArray())
Base64.encodeToString(("Salted__"+salt).toByteArray().plus(encryptTextByte), DEFAULT)
어떻게 든 작동하지만 사이트에서 결과를 가져올 수 없습니다. 미리 조언 해 주셔서 감사합니다.
"그것은 어떻게 든 작품"무엇을 의미 하는가를 얻을 수 ByteArrays를 사용할 필요가 코 틀린에 PHP의 MD5() 함수에서 = 사실을 PARAM "적인 raw_output"를 사용하는 경우? – zaph
결과가 나오지만 PHP에서와 다르게 보입니다. 나는 때문에 MD5 기능의 추측 : 의 PHP의 MD5 -> e5fddc06aa004f5524c8433f42c7ed60 내 md5Encode -> 5dc06a004f55248433f427d60 – Denis
문제가 내가 MD5를 (값, true)를 실현 할 수 없습니다입니다. raw_output param이 TRUE 인 경우 – Denis