当前位置: 首页 > 知识库问答 >
问题:

如何加密java字符串在C考虑他们的大小差异?

谢昊乾
2023-03-14

晚上好,我正在构建一个java项目,它通过JNI与英特尔SGX飞地通信,并看到它发送的信息被飞地密封。

然而,解密信息会返回我无法理解的信息,在这一点上,我认为这是由于大小的差异,但我并不完全理解它。

所以,我知道Sizeof(char*)相当于1字节,就像Sizeof(jbyte)一样。然而,sizeof(jchar)相当于2个字节。

在获得这些知识后,我决定通过使用JByteArray来实现密封(或加密)功能,以绕过这个问题。这个字节[]应该以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_会影响密封吗?我不知道这可能是什么。我在java中接收字节[]的方式如下:

byte[] c = sgx.jni_sgx_seal_info("toEncrypt".getBytes(Charset.forName("UTF-8")));
String sealed = new String(c,StandardCharsets.UTF_8);

有人知道是什么影响了这一切吗?解封(解密)后的输出当前为�|(�

共有1个答案

暨成双
2023-03-14

您不能将随机字节(如通过加密产生的)转换为UTF-8(或许多多字节编码,8位单字节编码都可以)。字符串很可能会损坏,因为有描述非法字符的字节序列,它们将被替换为0xFFFE,即Unicode替换字符。

因此,您需要保留字节[],在解密字节数组(而不是字符串)之前,不要将其转换为字符串。

 类似资料:
  • 问题内容: 我需要加密的字符串会显示在2D条码中(PDF-417),所以当有人知道扫描的想法时,它就不会可读。 其他需求: 不应该复杂 它不应包含RSA,PKI基础结构,密钥对等。 它必须足够简单,以摆脱被监视的人,并且必须易于对其他有兴趣获取该数据的公司解密。他们打电话给我们,我们告诉他们标准,或者给他们一些简单的密钥,然后可以将其用于解密。 那些公司可能会使用不同的技术,因此最好坚持不依赖于某

  • 我为flutter找到了加密包来加密和解密一条消息,我成功地加密和解密了,但没有成功地在一个cas中使用这个独立的设备,如图所示。 这是一个例子,我用一个静态字符串和一个随机数组成一个明文,它允许更改生成的密钥,当我解密时,发现静态字符串与正则表达式匹配 目前我找不到如何输入我的加密密钥(fesesgesgneslg465esg6es4g)我塞拉赫要做这样的事情 ---------按下时,我生成一

  • 我有一些字符串(字符串结果),用户插入它在应用程序中没有任何大小写敏感策略用户可以插入,如:“fail”或“fail”或“fail”或“success”或“success”等。而且我只有一个方法用于它们,如fail()、success()和must call related method 现在,我想通过使用以下常量(成功、失败、...)将一个字符串使用到开关大小写语句中: 请注意: 1-我不想为结

  • 问题内容: 我在我的iPhone应用程序中使用Objective C中的加密类,但是我在努力通过Android应用程序在JAVA中使用相同的功能。我的加密代码如下: 我试图在JAVA中复制它,但是当我编码相同的数据时却得到了不同的字符串。所以我做错了事,但我无法弄清楚。这是我的JAVA代码: 谁能看到我要去哪里错了? 根据以下注释,我添加了getBytes,但是生成的字符串仍然不同: 问题答案:

  • 问题内容: 我听到一位同事说,即使我将String成员放在Java类中,即使String为空,我也要支付“ 24字节”的费用。准确吗?Integer,Float,Double是否相同?(与int,float,double相对,后者分别为4、4和8个字节)。 问题答案: 你要付4首或8个字节的 参考 。是否为每个“容器”对象实例额外的 对象 付费,取决于您如何获取空字符串。例如,如果您使用文字,那么

  • 我知道有几个与此相关的问题,但是大多数答案都提供了.NET4.0及以上版本的解决方案。对于我的用途,我必须以.NET3.5为目标。我想简单地加密和解密一个字符串存储在一个文件中,所讨论的文本不是敏感的用户/个人信息。