A computer-implemented method comprising: distributing a data item from a source computer to a plurality of servers (101, 101_1... 101_N) as a corresponding plurality of obfuscated portions of the data item, wherein the data item and each obfuscated portion comprises a bit matrix, wherein the bit matrices for the data item and the obfuscated portions are equal in size, wherein the obfuscated portions are generated by: creating a set of initial obfuscated portions that have a zero matrix as a sum, and distributing bits from the data item across the set of initial obfuscated portions, wherein each of the servers (101, 101_1... 101_N) stores a respective obfuscated portion from the plurality of obfuscated portions, and wherein the plurality of servers (101, 101_1... 101_N) comprises one or more groups of servers distributing a plurality of query vectors to the servers (101, 101_1... 101_N), the query vectors collectively identifying a sub-portion of the data item, wherein the plurality of query vectors are generated by: creating a set of initial query vectors that have a zero vector as a bitwise sum, and bitwise adding an index for the sub-portion of the data item to a query vector from the set of initial query vectors, and wherein distributing the plurality of query vectors comprises sending to each server (101, 101_1... 101_N) from the plurality of servers (101, 101_1... 101_N) a respective query vector from the plurality of query vectors; and determining a value of the sub-portion using a plurality of query result vectors received from the plurality of servers (101, 101_1... 101_N) in response to the plurality of query vectors, wherein determining the new value comprises combining the plurality of query result vectors using a bitwise sum. distributing a data item from a source computer to a plurality of servers (101, 101_1... 101_N) as a corresponding plurality of obfuscated portions of the data item, wherein the data item and each obfuscated portion comprises a bit matrix, wherein the bit matrices for the data item and the obfuscated portions are equal in size, wherein the obfuscated portions are generated by: creating a set of initial obfuscated portions that have a zero matrix as a sum, and distributing bits from the data item across the set of initial obfuscated portions, wherein each of the servers (101, 101_1... 101_N) stores a respective obfuscated portion from the plurality of obfuscated portions, and wherein the plurality of servers (101, 101_1... 101_N) comprises one or more groups of servers creating a set of initial obfuscated portions that have a zero matrix as a sum, and distributing bits from the data item across the set of initial obfuscated portions, wherein each of the servers (101, 101_1... 101_N) stores a respective obfuscated portion from the plurality of obfuscated portions, and wherein the plurality of servers (101, 101_1... 101_N) comprises one or more groups of servers distributing a plurality of query vectors to the servers (101, 101_1... 101_N), the query vectors collectively identifying a sub-portion of the data item, wherein the plurality of query vectors are generated by: creating a set of initial query vectors that have a zero vector as a bitwise sum, and bitwise adding an index for the sub-portion of the data item to a query vector from the set of initial query vectors, and wherein distributing the plurality of query vectors comprises sending to each server (101, 101_1... 101_N) from the plurality of servers (101, 101_1... 101_N) a respective query vector from the plurality of query vectors; and wherein the plurality of query vectors are generated by: creating a set of initial query vectors that have a zero vector as a bitwise sum, and bitwise adding an index for the sub-portion of the data item to a query vector from the set of initial query vectors, and creating a set of initial query vectors that have a zero vector as a bitwise sum, and bitwise adding an index for the sub-portion of the data item to a query vector from the set of initial query vectors, and wherein distributing the plurality of query vectors comprises sending to each server (101, 101_1... 101_N) from the plurality of servers (101, 101_1... 101_N) a respective query vector from the plurality of query vectors; and determining a value of the sub-portion using a plurality of query result vectors received from the plurality of servers (101, 101_1... 101_N) in response to the plurality of query vectors, wherein determining the new value comprises combining the plurality of query result vectors using a bitwise sum.