我有一些浮点数据,例如“3.9389005e-01”,我想用Blowfish加密。strtod 用于从字符串中获取浮点数。
但是 Blowfish 只加密整数。
所以我的计划是将每个 FP 值加密为两个整数,一个尾数和一个指数。然后存储为两个单独的加密值。
解密将返回尾数和指数,从而能够重构原始 FP 数。
有更整洁的解决方案吗?
河豚的一些演示代码在这里。
在需要加密的数组和相同大小的数组union
之间声明一个。double
uint8_t
要加密,请填写双字节,加密字节。要解密,请解密字节并读取双精度。
这种方法可以扩展到任何非字节数据类型,前提是您使用的密码输出相同大小的消息。
在填充的情况下,“获取uint8_t *
任何数据是will sometimes work, sometimes not; AES-256 will work with a
双of 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;
如果代码想要将 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);
或者,代码可以使用sprintf(buf, "%a", x);
您可以像访问任何其他指针一样访问任何指针。作为另一种数据类型,数据可能没有意义,但有可能:
double value = 123.456;
int *ptr = (int *) &value;
现在你有一个指向可以加密的sizeof(double)
字节(或整数)内存区域的指针。sizeof(double) / sizeof(int)
要取回double
解密后,您可以执行以下操作:
double new_value = *((double *) ptr);