0

我有一些浮点数据,例如“3.9389005e-01”,我想用Blowfish加密。strtod 用于从字符串中获取浮点数。

但是 Blowfish 只加密整数。

所以我的计划是将每个 FP 值加密为两个整数,一个尾数和一个指数。然后存储为两个单独的加密值。

解密将返回尾数和指数,从而能够重构原始 FP 数。

有更整洁的解决方案吗?

河豚的一些演示代码在这里

4

3 回答 3

0

在需要加密的数组和相同大小的数组union之间声明一个。doubleuint8_t

要加密,请填写双字节,加密字节。要解密,请解密字节并读取双精度。

这种方法可以扩展到任何非字节数据类型,前提是您使用的密码输出相同大小的消息

在填充的情况下,“获取uint8_t *任何数据是will sometimes work, sometimes not; AES-256 will work with aof size 8, but block implementations are liable to crash or corrupt data when working with a浮点浮点”的更快方法of size 4 (they will attempt to read 8 bytes, and write 8 bytes; where only four are actually available). Due to platform and compiler quirks, this may *still* work because after the可能有一些“内存填充”可用。

为了安全起见,例如,如果将密码填充到 256 位(32 字节),您将必须固定要同样填充的字节数组的长度。这样做的一种不太干净的方法是将字节数增加一个完整的填充数:

#include <stdio.h>

typedef struct {
        double a;
        long v;
        // Whatever else.
        // ...
} payload_t;

union {
        payload_t payload;
        unsigned char bytes[sizeof(payload_t)+32]; // 256 bits of margin
} data;

int main(void)
{
        data.payload.a = 3.14159;
        data.payload.v = 123456789;
        ...
        // Encrypt data.bytes, for a length integer multiple of 32 bytes
        size_t length = ((sizeof(payload_t)+31)/32)*32;
于 2012-11-11T11:09:22.090 回答
0

如果代码想要将 FP 值转换为字符串,然后对字符串进行加密,然后想要返回准确的FP 值,则需要以足够的精度转换 FP 数。使用"%.*e"DBL_DECIMAL_DIG(或DBL_DIG + 3如果不可用)。

#include <float.h>
// sign digit . fraction e sign expo \0 CYA
#define FP_BUF_SIZE (1+1+1+ (DBL_DECIMAL_DIG-1) + 1 + 1 + 4 + 1 + 10)

double x;
char buf[FP_BUF_SIZE];
sprintf(buf, "%.*e", DBL_DECIMAL_DIG - 1, x);
Encode(buf);

Ref Printf 宽度说明符以保持浮点值的精度

或者,代码可以使用sprintf(buf, "%a", x);

于 2014-10-30T16:59:04.917 回答
0

您可以像访问任何其他指针一样访问任何指针。作为另一种数据类型,数据可能没有意义,但有可能:

double value = 123.456;
int *ptr = (int *) &value;

现在你有一个指向可以加密的sizeof(double)字节(或整数)内存区域的指针。sizeof(double) / sizeof(int)

要取回double解密后,您可以执行以下操作:

double new_value = *((double *) ptr);
于 2012-11-10T12:28:03.857 回答