Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
193 views
in Technique[技术] by (71.8m points)

android - java.security.InvalidAlgorithmParameterException: Unsupported IV length: 10 bytes. Only 12 bytes long IV supported

Hello Everyone I am working on Android Project and i have to save JWT token in my sharedprefrences so for that i use Android KeyStore System to encrypt the data and store it i found some code from Internet and i rewrite it its works fine here it is

  fun Key_Store(Apikey: String){
   val keyGenerator : KeyGenerator = KeyGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_AES,
        "AndroidKeyStore"
    )

    val keyGenParameterSpec = KeyGenParameterSpec.Builder(
        "alias",
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
    )
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .build()


    keyGenerator.init(keyGenParameterSpec);
    val  secretKey: SecretKey = keyGenerator.generateKey()

    val  cipher:Cipher = Cipher.getInstance("AES/GCM/NoPadding")
    cipher.init(Cipher.ENCRYPT_MODE, secretKey)

    val iv = cipher.getIV();
    val encryption = cipher.doFinal(Apikey.toByteArray())
    Log.e("Real", "is " + Apikey)
    Log.e("Encription", "is " + encryption)


    //decrypting
    val keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);

    val secretKeyEntry = keyStore
        .getEntry("alias", null) as KeyStore.SecretKeyEntry

    val secretKey2 = secretKeyEntry.secretKey

    val cipher2 = Cipher.getInstance("AES/GCM/NoPadding")

    val spec = GCMParameterSpec(128, iv)
    cipher2.init(Cipher.DECRYPT_MODE, secretKey2, spec)

    val decodedData = cipher2.doFinal(encryption)
    val unencryptedString = String(decodedData)
    Log.e("UnEncription", "is " + unencryptedString)
}

this works fine its encript the data and also decryopt it but when i devide this function in two functions then its give error java.security.InvalidAlgorithmParameterException: Unsupported IV length: 10 bytes. Only 12 bytes long IV supported and not works for me here it is

  private fun encryptedKey (KEY_NAME: String, value: String){
    val keyGenerator : KeyGenerator = KeyGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_AES,
        "AndroidKeyStore"
    )

     val keyGenParameterSpec = KeyGenParameterSpec.Builder(
        "pryze",
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
    )
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .build()


    keyGenerator.init(keyGenParameterSpec);
    val  secretKey: SecretKey = keyGenerator.generateKey()

    val  cipher: Cipher = Cipher.getInstance("AES/GCM/NoPadding")
    cipher.init(Cipher.ENCRYPT_MODE, secretKey)

    val iv = cipher.getIV();
    val encryption = cipher.doFinal(value.toByteArray())

    val editor: SharedPreferences.Editor = sharedPrefs.edit()
    editor.putString(KEY_NAME+"EN", encryption.toString())
    editor.putString(KEY_NAME+"IV", iv.toString())
    editor.commit()
    Log.e("IV Top", "is " + iv)

}

private fun decryptKey (KEY_NAME: String): String?{

    val keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);

    val secretKeyEntry = keyStore
        .getEntry("pryze", null) as KeyStore.SecretKeyEntry

    val secretKey2 = secretKeyEntry.secretKey

    val cipher2 = Cipher.getInstance("AES/GCM/NoPadding")

    val spec = GCMParameterSpec(128, sharedPrefs.getString(KEY_NAME+"IV", null)?.toByteArray())
    cipher2.init(Cipher.DECRYPT_MODE, secretKey2, spec)


    val decodedData = cipher2.doFinal(sharedPrefs.getString(KEY_NAME+"EN", null)?.toByteArray())
    val unencryptedString = String(decodedData)
    Log.e("UnEncription", "is " + unencryptedString)

    return unencryptedString
}
question from:https://stackoverflow.com/questions/65932343/java-security-invalidalgorithmparameterexception-unsupported-iv-length-10-byte

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

now Its Works

 private fun encryptedKey (KEY_NAME: String, value: String){
    val keyGenerator : KeyGenerator = KeyGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_AES,
        "AndroidKeyStore"
    )

 
    val keyGenParameterSpec = KeyGenParameterSpec.Builder(
        "alies",
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
    )
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .build()


    keyGenerator.init(keyGenParameterSpec);
    val  secretKey: SecretKey = keyGenerator.generateKey()

    val  cipher: Cipher = Cipher.getInstance("AES/GCM/NoPadding")
    cipher.init(Cipher.ENCRYPT_MODE, secretKey)

    val iv = cipher.getIV();
    val encryption = cipher.doFinal(value.toByteArray())

    val editor: SharedPreferences.Editor = sharedPrefs.edit()
    editor.putString(KEY_NAME+"EN", Base64.encodeToString(encryption,Base64.DEFAULT))
    editor.putString(KEY_NAME+"IV", Base64.encodeToString(iv,Base64.DEFAULT))
    editor.commit()

}

private fun decryptKey (KEY_NAME: String): String?{

    val keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);

    val secretKeyEntry = keyStore
        .getEntry("alies", null) as KeyStore.SecretKeyEntry

    val secretKey2 = secretKeyEntry.secretKey

    val cipher2 = Cipher.getInstance("AES/GCM/NoPadding")
    val spec = GCMParameterSpec(128,Base64.decode(sharedPrefs.getString(KEY_NAME+"IV",null),Base64.DEFAULT))
    cipher2.init(Cipher.DECRYPT_MODE, secretKey2, spec)


    val decodedData = cipher2.doFinal(Base64.decode(sharedPrefs.getString(KEY_NAME+"EN",null),Base64.DEFAULT))
    val unencryptedString = String(decodedData)
    return unencryptedString
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...