考虑到它们的大小差异,如何在 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[] 并且在解密字节数组之前不要将其转换为字符串,而不是字符串。