In the second link you see that the input lines are pulled up to +5V. This tells you that the inputs are active low, as you can also see if you look at the keypad.cpp file I assume you are using on the target Arduino to read the keypad.
// bitMap stores ALL the keys that are being pressed.
for (byte c=0; c<sizeKpd.columns; c++) {
pin_mode(columnPins[c],OUTPUT);
pin_write(columnPins[c], LOW); // Begin column pulse output.
for (byte r=0; r<sizeKpd.rows; r++) {
bitWrite(bitMap[r], c, !pin_read(rowPins[r])); // keypress is active low so invert to high.
}
// Set pin to high impedance input. Effectively ends column pulse.
pin_write(columnPins[c],HIGH);
pin_mode(columnPins[c],INPUT);
}
You can get away with transistors that selctively connect the column lines to the row pins, but need to look at the cross connection - the columns are strobed low one at a time to read across the matrix of keys, and the resulting table of bits are then translated into a keypress. Since the columns are low at separate times, you need to make sure there's no cross-conduction to the one column that is low while it is being scanned - I think that's what you mean by 'voltage leaks' - reverse biased FETs will conduct due to the intrinsic body diode, so an additional diode would be needed. Looks like the columns outputs will momentary go high before going open after each scan.
The next issue is going to be timing, to detect when a keystroke has been scanned, and to hold the inputs at the right values while that occurs, then I'd guess that the target looks for a no press before looking for the next key. You should be able to see the three column outputs strobing low for each read cycle with the second Arduino, and time the key simulation from that. Once you're looking at the column outputs, you could also just use an interrupt driven routine that switches the row inputs to the chosen state directly for each character required, you'd need to check the timing of the strobing to make sure that is achievable in the time available.