如何在Android库中提供一种使用自定义加密的方法?



我有一个库,它有默认的方式来加密它使用的东西,这意味着用户只需要提供一个字符串作为密钥。

lib.encryption("key")
lib.doEncryptedStuff() // use default encryption

我希望允许用户使用自定义加密,包括那些实现自定义java加密提供程序的加密。我的问题是,要求用户使用这种加密方法的正确方法应该是什么?现在我想到了请求两个密码——一个用于加密,一个用于解密。

// create and init() ciphers here
lib.encryption(cipherEncrypt, cipherDecrypt)
lib.doEncryptedStuff() // use custom ciphers

但我不确定这是否是正确的方法。密码就够了吗?还是应该提供加密接口供用户实现?我记得有重用IV的问题,这意味着密码重新初始化?

我面临的另一个问题是,我很难泛化接口。就像ECB的AES一样,它可以使用encrypt()/decrypt()方法,但对于CBC,它需要IV,它也可以存储在加密的数据中。真是一团糟。

看来我已经搞定了。我使用了类似流的方法,但没有绑定到流。它允许使用任何加密用户需要通过传递接口作为参数。

我接口:

interface Encryption
{
fun encrypt(
read:  (buffer: ByteArray, count: Int) -> Int,
write: (buffer: ByteArray, count: Int) -> Unit
)
fun decrypt(
read:  (buffer: ByteArray, count: Int) -> Int,
write: (buffer: ByteArray, count: Int) -> Unit
)
}

示例实现:

// init cipher and buffer
val cipher = Cipher.getInstance(MODE)
val buffer = ByteArray(BLOCK_SIZE)
cipher.init(Cipher.ENCRYPT_MODE, keystore.getKey(KEY_ALIAS, null))
// write iv (when decrypting read IV from beginning)
val iv = cipher.iv
write(iv, iv.size)
// write data
var count = 0
while (true)
{
count = read(buffer, BLOCK_SIZE)
if (count < BLOCK_SIZE)
break
val encrypted = cipher.update(buffer, 0, count)
write(encrypted, encrypted.size)
}
// flush remains
if (count > 0)
{
val final = cipher.doFinal(buffer, 0, count)
write(final, final.size)
}

示例用法(输入和输出都是流):

encryption.encrypt(
read = { buffer, count ->
input.read(buffer, 0, count)
},
write = { buffer, count ->
output.write(buffer, 0, count)
}
)

最新更新