考虑到它们的大小差异,如何在 C 中加密 java 个字符串?
How to encrypt java Strings in C considering their size difference?
晚上好,
我正在构建一个 java 项目,它通过 JNI 与英特尔 SGX 飞地通信,并看到它发送的信息被飞地密封。
然而,解密信息returns信息我看不懂,在这一点上,我认为这是由于大小差异,但我并不完全理解。
所以,我知道Sizeof(char*)
相当于1个字节,就像sizeof(jbyte)
一样。但是,sizeof(jchar)
相当于 2 个字节。
在了解了这些知识后,我决定通过使用 JByteArray 来实现密封(或加密)功能,以规避这个问题。这个 byte[] 应该以 UTF-8 还是 UTF-16 给出?对整体功能有影响吗?
这是我所做的一个例子:
JNIEXPORT jbyteArray JNICALL Java_sgxUtils_SgxFunctions_jni_1sgx_1seal_1info
(JNIEnv * env, jobject, jbyteArray jArray){
//Create a char* from the given byte array.
jbyte *b = env->GetByteArrayElements(jArray,NULL);
int StringSize = env->GetArrayLength(jArray);
char* c = (char*)malloc(sizeof(char) * StringSize);
memcpy(c,b,StringSize);
//Calculate the size of the encryption.
size_t sealed_size = sizeof(sgx_sealed_data_t) + StringSize;
//Create a uint8_t pointer to store the sealed information
uint8_t* sealed_data = (uint8_t*)malloc(sealed_size);
sgx_status_t ecall_status; //Store the status of the ecall.
seal(global_eid, &ecall_status,(uint8_t*)&c,StringSize, sgx_sealed_data_t*)sealed_data,sealed_size);
//Produce the jbyteArray to return:
jbyte* jresult = (jbyte*)calloc(sizeof(jbyte),sealed_size);
for(int i = 0 ; i < sealed_size ;i++){
jresult[i] = (jbyte)sealed_data[i];
}
jbyteArray jArray2 = env->NewByteArray(sealed_size+1);
env->SetByteArrayRegion(jArray2,0,sealed_size,jresult);
return jArray2;
使用uint8_t会影响密封吗?我不知道它可能是什么。
我在java中收到这个byte[]的方式是这样的:
byte[] c = sgx.jni_sgx_seal_info("toEncrypt".getBytes(Charset.forName("UTF-8")));
String sealed = new String(c,StandardCharsets.UTF_8);
有人知道是什么影响了这个吗?解封(解密)后的输出目前为�|(�
您不能将随机字节(例如通过加密产生的字节)转换为 UTF-8
(或许多 multi-byte 编码,8 位单字节编码即可)。字符串很可能会损坏,因为存在描述非法字符的字节序列,它们将被替换为 0xFFFE
或 �
即 unicode 替换字符。
所以您需要保留 byte[]
并且在解密字节数组之前不要将其转换为字符串,而不是字符串。
晚上好, 我正在构建一个 java 项目,它通过 JNI 与英特尔 SGX 飞地通信,并看到它发送的信息被飞地密封。
然而,解密信息returns信息我看不懂,在这一点上,我认为这是由于大小差异,但我并不完全理解。
所以,我知道Sizeof(char*)
相当于1个字节,就像sizeof(jbyte)
一样。但是,sizeof(jchar)
相当于 2 个字节。
在了解了这些知识后,我决定通过使用 JByteArray 来实现密封(或加密)功能,以规避这个问题。这个 byte[] 应该以 UTF-8 还是 UTF-16 给出?对整体功能有影响吗?
这是我所做的一个例子:
JNIEXPORT jbyteArray JNICALL Java_sgxUtils_SgxFunctions_jni_1sgx_1seal_1info
(JNIEnv * env, jobject, jbyteArray jArray){
//Create a char* from the given byte array.
jbyte *b = env->GetByteArrayElements(jArray,NULL);
int StringSize = env->GetArrayLength(jArray);
char* c = (char*)malloc(sizeof(char) * StringSize);
memcpy(c,b,StringSize);
//Calculate the size of the encryption.
size_t sealed_size = sizeof(sgx_sealed_data_t) + StringSize;
//Create a uint8_t pointer to store the sealed information
uint8_t* sealed_data = (uint8_t*)malloc(sealed_size);
sgx_status_t ecall_status; //Store the status of the ecall.
seal(global_eid, &ecall_status,(uint8_t*)&c,StringSize, sgx_sealed_data_t*)sealed_data,sealed_size);
//Produce the jbyteArray to return:
jbyte* jresult = (jbyte*)calloc(sizeof(jbyte),sealed_size);
for(int i = 0 ; i < sealed_size ;i++){
jresult[i] = (jbyte)sealed_data[i];
}
jbyteArray jArray2 = env->NewByteArray(sealed_size+1);
env->SetByteArrayRegion(jArray2,0,sealed_size,jresult);
return jArray2;
使用uint8_t会影响密封吗?我不知道它可能是什么。 我在java中收到这个byte[]的方式是这样的:
byte[] c = sgx.jni_sgx_seal_info("toEncrypt".getBytes(Charset.forName("UTF-8")));
String sealed = new String(c,StandardCharsets.UTF_8);
有人知道是什么影响了这个吗?解封(解密)后的输出目前为�|(�
您不能将随机字节(例如通过加密产生的字节)转换为 UTF-8
(或许多 multi-byte 编码,8 位单字节编码即可)。字符串很可能会损坏,因为存在描述非法字符的字节序列,它们将被替换为 0xFFFE
或 �
即 unicode 替换字符。
所以您需要保留 byte[]
并且在解密字节数组之前不要将其转换为字符串,而不是字符串。